﻿[INFO] Scanning for projects...
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for com.xuekairui:zhijiayun-user:jar:1.0.0
[WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: com.xuekairui:zhijiayun-common:jar -> duplicate declaration of version (?) @ line 96, column 21
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING] 
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] zhijiayun-pharmacy                                                 [pom]
[INFO] zhijiayun-common                                                   [jar]
[INFO] zhijiayun-user                                                     [jar]
[INFO] zhijiayun-payment                                                  [jar]
[INFO] zhijiayun-invite                                                   [jar]
[INFO] zhijiayun-gateway                                                  [jar]
[INFO] 
[INFO] ------------------< com.xuekairui:zhijiayun-pharmacy >------------------
[INFO] Building zhijiayun-pharmacy 1.0-SNAPSHOT                           [1/6]
[INFO]   from pom.xml
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-pharmacy ---
[INFO] 
[INFO] -------------------< com.xuekairui:zhijiayun-common >-------------------
[INFO] Building zhijiayun-common 1.0.0                                    [2/6]
[INFO]   from zhijiayun-common\pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-common ---
[INFO] Deleting D:\project\zhijiayun-pharmacy\zhijiayun-common\target
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ zhijiayun-common ---
[INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-common\src\main\resources
[INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-common\src\main\resources
[INFO] 
[INFO] --- compiler:3.14.1:compile (default-compile) @ zhijiayun-common ---
[INFO] Recompiling the module because of changed source code.
[INFO] Compiling 7 source files with javac [debug parameters release 17] to target\classes
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ zhijiayun-common ---
[INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-common\src\test\resources
[INFO] 
[INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ zhijiayun-common ---
[INFO] No sources to compile
[INFO] 
[INFO] --- surefire:3.5.5:test (default-test) @ zhijiayun-common ---
[INFO] No tests to run.
[INFO] 
[INFO] --------------------< com.xuekairui:zhijiayun-user >--------------------
[INFO] Building zhijiayun-user 1.0.0                                      [3/6]
[INFO]   from zhijiayun-user\pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-user ---
[INFO] Deleting D:\project\zhijiayun-pharmacy\zhijiayun-user\target
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ zhijiayun-user ---
[INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-user\src\main\resources
[INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-user\src\main\resources
[INFO] 
[INFO] --- compiler:3.14.1:compile (default-compile) @ zhijiayun-user ---
[INFO] Recompiling the module because of changed dependency.
[INFO] Compiling 120 source files with javac [debug parameters release 17] to target\classes
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ zhijiayun-user ---
[INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-user\src\test\resources
[INFO] 
[INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ zhijiayun-user ---
[INFO] Recompiling the module because of changed dependency.
[INFO] 
[INFO] --- surefire:3.5.5:test (default-test) @ zhijiayun-user ---
[INFO] 
[INFO] ------------------< com.xuekairui:zhijiayun-payment >-------------------
[INFO] Building zhijiayun-payment 1.0.0                                   [4/6]
[INFO]   from zhijiayun-payment\pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-payment ---
[INFO] Deleting D:\project\zhijiayun-pharmacy\zhijiayun-payment\target
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ zhijiayun-payment ---
[INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-payment\src\main\resources
[INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-payment\src\main\resources
[INFO] 
[INFO] --- compiler:3.14.1:compile (default-compile) @ zhijiayun-payment ---
[INFO] Recompiling the module because of changed dependency.
[INFO] Compiling 47 source files with javac [debug parameters release 17] to target\classes
[INFO] /D:/project/zhijiayun-pharmacy/zhijiayun-payment/src/main/java/com/xuekairui/payment/service/AlipayAnxinPayService.java: D:\project\zhijiayun-pharmacy\zhijiayun-payment\src\main\java\com\xuekairui\payment\service\AlipayAnxinPayService.java使用了未经检查或不安全的操作。
[INFO] /D:/project/zhijiayun-pharmacy/zhijiayun-payment/src/main/java/com/xuekairui/payment/service/AlipayAnxinPayService.java: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ zhijiayun-payment ---
[INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-payment\src\test\resources
[INFO] 
[INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ zhijiayun-payment ---
[INFO] No sources to compile
[INFO] 
[INFO] --- surefire:3.5.5:test (default-test) @ zhijiayun-payment ---
[INFO] No tests to run.
[INFO] 
[INFO] -------------------< com.xuekairui:zhijiayun-invite >-------------------
[INFO] Building zhijiayun-invite 1.0.0                                    [5/6]
[INFO]   from zhijiayun-invite\pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-invite ---
[INFO] Deleting D:\project\zhijiayun-pharmacy\zhijiayun-invite\target
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ zhijiayun-invite ---
[INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-invite\src\main\resources
[INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-invite\src\main\resources
[INFO] 
[INFO] --- compiler:3.14.1:compile (default-compile) @ zhijiayun-invite ---
[INFO] Recompiling the module because of changed dependency.
[INFO] Compiling 20 source files with javac [debug parameters release 17] to target\classes
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ zhijiayun-invite ---
[INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-invite\src\test\resources
[INFO] 
[INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ zhijiayun-invite ---
[INFO] No sources to compile
[INFO] 
[INFO] --- surefire:3.5.5:test (default-test) @ zhijiayun-invite ---
[INFO] No tests to run.
[INFO] 
[INFO] ------------------< com.xuekairui:zhijiayun-gateway >-------------------
[INFO] Building zhijiayun-gateway 1.0.0                                   [6/6]
[INFO]   from zhijiayun-gateway\pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-gateway ---
[INFO] Deleting D:\project\zhijiayun-pharmacy\zhijiayun-gateway\target
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ zhijiayun-gateway ---
[INFO] Copying 3 resources from src\main\resources to target\classes
[INFO] Copying 29 resources from src\main\resources to target\classes
[INFO] 
[INFO] --- compiler:3.14.1:compile (default-compile) @ zhijiayun-gateway ---
[INFO] Recompiling the module because of changed dependency.
[INFO] Compiling 6 source files with javac [debug parameters release 17] to target\classes
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ zhijiayun-gateway ---
[INFO] Copying 2 resources from src\test\resources to target\test-classes
[INFO] 
[INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ zhijiayun-gateway ---
[INFO] Recompiling the module because of changed dependency.
[INFO] Compiling 24 source files with javac [debug parameters release 17] to target\test-classes
[INFO] 
[INFO] --- surefire:3.5.5:test (default-test) @ zhijiayun-gateway ---
[INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running 运营管理接口测试
15:17:02.339 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [com.xuekairui.gateway.AdminControllerTest]: AdminControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:17:02.546 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.AdminControllerTest

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::               (v3.5.14)

15:17:03.189  INFO [] [] [        main] c.x.g.AdminControllerTest      : Starting AdminControllerTest using Java 17.0.17 with PID 37656 (started by geloger in D:\project\zhijiayun-pharmacy\zhijiayun-gateway)
15:17:03.190 DEBUG [] [] [        main] c.x.g.AdminControllerTest      : Running with Spring Boot v3.5.14, Spring v6.2.18
15:17:03.190  INFO [] [] [        main] c.x.g.AdminControllerTest      : The following 1 profile is active: "test"
15:17:04.700  INFO [] [] [        main] epositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
15:17:04.704  INFO [] [] [        main] epositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
15:17:04.767  INFO [] [] [        main] epositoryConfigurationDelegate : Finished Spring Data repository scanning in 29 ms. Found 0 Redis repository interfaces.
 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.5.16 
15:17:07.002  INFO [] [] [        main] c.x.u.service.AliyunSmsClient  : 阿里云短信客户端初始化成功，端点: dysmsapi.aliyuncs.com
15:17:07.698  INFO [] [] [        main] c.z.hikari.HikariDataSource    : HikariPool-1 - Starting...
15:17:08.030  INFO [] [] [        main] c.z.hikari.pool.HikariPool     : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@6075a4ea
15:17:08.032  INFO [] [] [        main] c.z.hikari.HikariDataSource    : HikariPool-1 - Start completed.
[DB-INIT] Test database initialized successfully
15:17:09.800  INFO [] [] [        main] .b.a.e.w.EndpointLinksResolver : Exposing 1 endpoint beneath base path '/actuator'
15:17:09.848  WARN [] [] [        main] etailsServiceAutoConfiguration : 

Using generated security password: 696adf54-5590-4d2d-a255-2a0669d6228b

This generated password is for development use only. Your security configuration must be updated before running your application in production.

15:17:09.867  INFO [] [] [        main] zeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager
15:17:10.441  INFO [] [] [        main] tisPlusApplicationContextAware : Register ApplicationContext instances org.springframework.web.context.support.GenericWebApplicationContext@1c26273d
15:17:10.769 DEBUG [] [] [        main] c.x.g.f.RequestLoggingFilter   : Filter 'requestLoggingFilter' configured for use
15:17:10.769 DEBUG [] [] [        main] c.x.g.filter.RateLimitFilter   : Filter 'rateLimitFilter' configured for use
15:17:10.769 DEBUG [] [] [        main] .x.u.s.JwtAuthenticationFilter : Filter 'jwtAuthenticationFilter' configured for use
15:17:10.770  INFO [] [] [        main] w.SpringBootMockServletContext : Initializing Spring TestDispatcherServlet ''
15:17:10.770  INFO [] [] [        main] .s.t.w.s.TestDispatcherServlet : Initializing Servlet ''
15:17:10.771  INFO [] [] [        main] .s.t.w.s.TestDispatcherServlet : Completed initialization in 1 ms
15:17:10.922  INFO [] [] [        main] c.x.g.AdminControllerTest      : Started AdminControllerTest in 8.242 seconds (process running for 9.669)
15:17:10.989 DEBUG [HxLyDBsZ] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==>  Preparing: SELECT * FROM t_payment_order WHERE status = 'PENDING' AND expire_time < ?
15:17:11.030 DEBUG [HxLyDBsZ] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==> Parameters: 2026-07-02T15:17:10.946416500(LocalDateTime)
15:17:11.059 DEBUG [HxLyDBsZ] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : <==      Total: 0
15:17:11.100 DEBUG [] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (role = ?) LIMIT 1
15:17:11.102 DEBUG [] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: SUPER_ADMIN(String)
15:17:11.106 DEBUG [] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 0
15:17:11.108 DEBUG [] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (nickname = ?)
15:17:11.109 DEBUG [] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: admin(String)
15:17:11.111 DEBUG [] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 0
15:17:11.183 DEBUG [] [] [        main] c.x.u.m.UserMapper.insert      : ==>  Preparing: INSERT INTO t_user ( id, nickname, password, status, role, token_version, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )
15:17:11.184 DEBUG [] [] [        main] c.x.u.m.UserMapper.insert      : ==> Parameters: 2072580326515744769(Long), admin(String), $2a$10$RyC8dyJdNKjVVRbXeWqdk.hqyuld8W5xqkAcIRKTLR9ui6GKQlYk2(String), 1(Integer), SUPER_ADMIN(String), 0(Long), 2026-07-02T15:17:11.179740300(LocalDateTime), 2026-07-02T15:17:11.179740300(LocalDateTime)
15:17:11.192 DEBUG [] [] [        main] c.x.u.m.UserMapper.insert      : <==    Updates: 1
15:17:11.192  INFO [] [] [        main] c.x.u.c.SuperAdminInitializer  : 已创建默认超级管理员，用户名：admin，默认密码：admin@123，请尽快修改默认密码
mvn : Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap cl
asspath has been appended
所在位置 行:1 字符: 165
+ ... eep -Seconds 3; mvn clean test -pl zhijiayun-gateway -am 2>&1 | Out-F ...
+                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (Java HotSpot(TM...s been appended:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
 
15:17:15.291 DEBUG [jPPgGtHL] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/config | IP: 127.0.0.1
15:17:15.370 DEBUG [jPPgGtHL] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:15.370 DEBUG [jPPgGtHL] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:15.377 DEBUG [jPPgGtHL] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:15.407 DEBUG [jPPgGtHL] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:17:15.407 DEBUG [jPPgGtHL] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:17:15.414 DEBUG [jPPgGtHL] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:15.452 DEBUG [jPPgGtHL] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/config 200 162ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/invite/config
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#getInviteConfig()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"jPPgGtHL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":0,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":null,"miniappPath":null,"miniappAppId":null,"wechatRedirectUrl":null,"dingtalkAppId":null,"feishuAppId":null,"landingTitle":"邀请你加入智价云（药店版）","landingDesc":"登录智价云（药店版），邀请好友各得好礼","appName":"智价云（药店版）","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter}，在这里发现了一个药店采购神器——{appName}！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册，你也会获得会员权益！","rewardDescription":"邀请人每成功邀请1家药店注册，赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店，{registeredCount}家注册，累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionApp":"下载安装客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序，邀请码已自动填入","instructionWechat":"关注公众号后，在菜单中输入邀请码：{code} 完成注册","instructionDingtalk":"打开钉钉应用，搜索\"{appName}\"并输入邀请码：{code}","instructionFeishu":"打开飞书应用，搜索\"{appName}\"并输入邀请码：{code}","instructionDefault":"下载客户端后，在注册页面输入邀请码：{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976635416}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:15.521 DEBUG [KedrtyDL] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/config | IP: 127.0.0.1
15:17:15.529  WARN [KedrtyDL] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/config 401 8ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/invite/config
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"KedrtyDL", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976635526}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:15.541 DEBUG [AbpCJb6T] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/config | IP: 127.0.0.1
15:17:15.544 DEBUG [AbpCJb6T] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:15.545 DEBUG [AbpCJb6T] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:15.547 DEBUG [AbpCJb6T] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:15.550 DEBUG [AbpCJb6T] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:17:15.551 DEBUG [AbpCJb6T] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:17:15.554 DEBUG [AbpCJb6T] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:15.557 DEBUG [AbpCJb6T] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/config 200 16ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/invite/config
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#getInviteConfig()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"AbpCJb6T", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":0,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":null,"miniappPath":null,"miniappAppId":null,"wechatRedirectUrl":null,"dingtalkAppId":null,"feishuAppId":null,"landingTitle":"邀请你加入智价云（药店版）","landingDesc":"登录智价云（药店版），邀请好友各得好礼","appName":"智价云（药店版）","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter}，在这里发现了一个药店采购神器——{appName}！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册，你也会获得会员权益！","rewardDescription":"邀请人每成功邀请1家药店注册，赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店，{registeredCount}家注册，累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionApp":"下载安装客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序，邀请码已自动填入","instructionWechat":"关注公众号后，在菜单中输入邀请码：{code} 完成注册","instructionDingtalk":"打开钉钉应用，搜索\"{appName}\"并输入邀请码：{code}","instructionFeishu":"打开飞书应用，搜索\"{appName}\"并输入邀请码：{code}","instructionDefault":"下载客户端后，在注册页面输入邀请码：{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976635555}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:15.574 DEBUG [bc3sPgK8] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/invite/config | IP: 127.0.0.1
15:17:15.578 DEBUG [bc3sPgK8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:15.579 DEBUG [bc3sPgK8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:15.582 DEBUG [bc3sPgK8] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:15.710 DEBUG [bc3sPgK8] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:17:15.711 DEBUG [bc3sPgK8] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:17:15.713 DEBUG [bc3sPgK8] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:15.723 DEBUG [bc3sPgK8] [1] [        main] c.x.i.m.I.updateById           : ==>  Preparing: UPDATE t_invite_config SET reward_crawler_count=?, reward_type=?, reward_months=?, max_daily_reward=?, invite_code_expire_days=?, max_invite_per_day=?, max_total_invites=?, landing_title=?, landing_desc=?, app_name=?, status=?, share_title_template=?, copy_text_template=?, reward_description=?, summary_text_template=?, instruction_windows=?, instruction_app=?, instruction_miniapp=?, instruction_wechat=?, instruction_dingtalk=?, instruction_feishu=?, instruction_default=?, create_time=?, update_time=? WHERE id=?
15:17:15.725 DEBUG [bc3sPgK8] [1] [        main] c.x.i.m.I.updateById           : ==> Parameters: 5(Integer), MEMBERSHIP(String), 1(Integer), 50(Integer), 30(Integer), 10(Integer), 30(Integer), 测试标题(String), 登录智价云（药店版），邀请好友各得好礼(String), 智价云（药店版）(String), 1(Integer), {inviter} 邀请你加入{appName}(String), 我是{inviter}，在这里发现了一个药店采购神器——{appName}！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册，你也会获得会员权益！(String), 邀请人每成功邀请1家药店注册，赠送1个月高级会员时长(String), 已邀请{totalInvited}家药店，{registeredCount}家注册，累计获得{totalReward}个月高级会员(String), 下载安装Windows客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入(String), 下载安装客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入(String), 点击按钮打开小程序，邀请码已自动填入(String), 关注公众号后，在菜单中输入邀请码：{code} 完成注册(String), 打开钉钉应用，搜索"{appName}"并输入邀请码：{code}(String), 打开飞书应用，搜索"{appName}"并输入邀请码：{code}(String), 下载客户端后，在注册页面输入邀请码：{code} 即可享受奖励(String), 2026-07-02T15:17:14(LocalDateTime), 2026-07-02T15:17:14(LocalDateTime), 1(Long)
15:17:15.732 DEBUG [bc3sPgK8] [1] [        main] c.x.i.m.I.updateById           : <==    Updates: 1
15:17:15.732  INFO [bc3sPgK8] [1] [        main] c.x.i.s.InviteConfigService    : 邀请配置已更新: rewardType=MEMBERSHIP, rewardMonths=1, appDownloadUrl=null, miniappPath=null
15:17:15.738 DEBUG [bc3sPgK8] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:15.739 DEBUG [bc3sPgK8] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580345629188098(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:15.735046500(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 1(Long), INVITE_CONFIG(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:15.737854200(LocalDateTime)
15:17:15.747 DEBUG [bc3sPgK8] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:15.747  WARN [bc3sPgK8] [1] [        main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG, 结果: SUCCESS
15:17:15.747 DEBUG [bc3sPgK8] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
15:17:15.749 DEBUG [bc3sPgK8] [1] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/invite/config 200 175ms

MockHttpServletRequest:
      HTTP Method = PUT
      Request URI = /api/admin/invite/config
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g", Content-Length:"196"]
             Body = {
    "rewardCrawlerCount": 5,
    "maxDailyReward": 50,
    "inviteCodeExpireDays": 30,
    "maxInvitePerDay": 10,
    "landingTitle": "测试标题",
    "appName": "智价云（药店版）"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#updateInviteConfig(InviteConfigRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"bc3sPgK8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":5,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":null,"miniappPath":null,"miniappAppId":null,"wechatRedirectUrl":null,"dingtalkAppId":null,"feishuAppId":null,"landingTitle":"测试标题","landingDesc":"登录智价云（药店版），邀请好友各得好礼","appName":"智价云（药店版）","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter}，在这里发现了一个药店采购神器——{appName}！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册，你也会获得会员权益！","rewardDescription":"邀请人每成功邀请1家药店注册，赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店，{registeredCount}家注册，累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionApp":"下载安装客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序，邀请码已自动填入","instructionWechat":"关注公众号后，在菜单中输入邀请码：{code} 完成注册","instructionDingtalk":"打开钉钉应用，搜索\"{appName}\"并输入邀请码：{code}","instructionFeishu":"打开飞书应用，搜索\"{appName}\"并输入邀请码：{code}","instructionDefault":"下载客户端后，在注册页面输入邀请码：{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976635747}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:15.762 DEBUG [rtsu3PJe] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/invite/config | IP: 127.0.0.1
15:17:15.765 DEBUG [rtsu3PJe] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:15.766 DEBUG [rtsu3PJe] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:15.770 DEBUG [rtsu3PJe] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:15.773 DEBUG [rtsu3PJe] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:17:15.773 DEBUG [rtsu3PJe] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:17:15.777 DEBUG [rtsu3PJe] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:15.779 DEBUG [rtsu3PJe] [1] [        main] c.x.i.m.I.updateById           : ==>  Preparing: UPDATE t_invite_config SET reward_crawler_count=?, reward_type=?, reward_months=?, max_daily_reward=?, invite_code_expire_days=?, max_invite_per_day=?, max_total_invites=?, app_download_url=?, miniapp_path=?, miniapp_app_id=?, wechat_redirect_url=?, dingtalk_app_id=?, feishu_app_id=?, landing_title=?, landing_desc=?, app_name=?, status=?, share_title_template=?, copy_text_template=?, reward_description=?, summary_text_template=?, instruction_windows=?, instruction_app=?, instruction_miniapp=?, instruction_wechat=?, instruction_dingtalk=?, instruction_feishu=?, instruction_default=?, create_time=?, update_time=? WHERE id=?
15:17:15.781 DEBUG [rtsu3PJe] [1] [        main] c.x.i.m.I.updateById           : ==> Parameters: 5(Integer), MEMBERSHIP(String), 1(Integer), 50(Integer), 30(Integer), 10(Integer), 30(Integer), https://download.example.com/app.exe(String), /pages/download/index(String), wx1234567890(String), https://mp.weixin.qq.com/xxx(String), dingxxx(String), feishuxxx(String), 邀请你加入(String), 高效数据采集(String), 智价云（药店版）(String), 1(Integer), {inviter} 邀请你加入{appName}(String), 我是{inviter}，在这里发现了一个药店采购神器——{appName}！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册，你也会获得会员权益！(String), 邀请人每成功邀请1家药店注册，赠送1个月高级会员时长(String), 已邀请{totalInvited}家药店，{registeredCount}家注册，累计获得{totalReward}个月高级会员(String), 下载安装Windows客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入(String), 下载安装客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入(String), 点击按钮打开小程序，邀请码已自动填入(String), 关注公众号后，在菜单中输入邀请码：{code} 完成注册(String), 打开钉钉应用，搜索"{appName}"并输入邀请码：{code}(String), 打开飞书应用，搜索"{appName}"并输入邀请码：{code}(String), 下载客户端后，在注册页面输入邀请码：{code} 即可享受奖励(String), 2026-07-02T15:17:14(LocalDateTime), 2026-07-02T15:17:14(LocalDateTime), 1(Long)
15:17:15.788 DEBUG [rtsu3PJe] [1] [        main] c.x.i.m.I.updateById           : <==    Updates: 1
15:17:15.789  INFO [rtsu3PJe] [1] [        main] c.x.i.s.InviteConfigService    : 邀请配置已更新: rewardType=MEMBERSHIP, rewardMonths=1, appDownloadUrl=https://download.example.com/app.exe, miniappPath=/pages/download/index
15:17:15.790 DEBUG [rtsu3PJe] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:15.791 DEBUG [rtsu3PJe] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580345817931777(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:15.789480700(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 1(Long), INVITE_CONFIG(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:15.790528200(LocalDateTime)
15:17:15.797 DEBUG [rtsu3PJe] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:15.798  WARN [rtsu3PJe] [1] [        main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG, 结果: SUCCESS
15:17:15.798 DEBUG [rtsu3PJe] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
15:17:15.800 DEBUG [rtsu3PJe] [1] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/invite/config 200 38ms

MockHttpServletRequest:
      HTTP Method = PUT
      Request URI = /api/admin/invite/config
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g", Content-Length:"503"]
             Body = {
    "rewardCrawlerCount": 5,
    "maxDailyReward": 50,
    "inviteCodeExpireDays": 30,
    "maxInvitePerDay": 10,
    "appDownloadUrl": "https://download.example.com/app.exe",
    "miniappPath": "/pages/download/index",
    "miniappAppId": "wx1234567890",
    "wechatRedirectUrl": "https://mp.weixin.qq.com/xxx",
    "dingtalkAppId": "dingxxx",
    "feishuAppId": "feishuxxx",
    "landingTitle": "邀请你加入",
    "landingDesc": "高效数据采集",
    "appName": "智价云（药店版）"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#updateInviteConfig(InviteConfigRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"rtsu3PJe", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":5,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":"https://download.example.com/app.exe","miniappPath":"/pages/download/index","miniappAppId":"wx1234567890","wechatRedirectUrl":"https://mp.weixin.qq.com/xxx","dingtalkAppId":"dingxxx","feishuAppId":"feishuxxx","landingTitle":"邀请你加入","landingDesc":"高效数据采集","appName":"智价云（药店版）","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter}，在这里发现了一个药店采购神器——{appName}！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册，你也会获得会员权益！","rewardDescription":"邀请人每成功邀请1家药店注册，赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店，{registeredCount}家注册，累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionApp":"下载安装客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序，邀请码已自动填入","instructionWechat":"关注公众号后，在菜单中输入邀请码：{code} 完成注册","instructionDingtalk":"打开钉钉应用，搜索\"{appName}\"并输入邀请码：{code}","instructionFeishu":"打开飞书应用，搜索\"{appName}\"并输入邀请码：{code}","instructionDefault":"下载客户端后，在注册页面输入邀请码：{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976635798}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:15.808 DEBUG [jsZ82rt7] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/invite/config | IP: 127.0.0.1
15:17:15.812  WARN [jsZ82rt7] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/invite/config 401 4ms

MockHttpServletRequest:
      HTTP Method = PUT
      Request URI = /api/admin/invite/config
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
             Body = {}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"jsZ82rt7", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976635810}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:15.822 DEBUG [XF5QAxNm] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/configs | IP: 127.0.0.1
15:17:15.824 DEBUG [XF5QAxNm] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:15.825 DEBUG [XF5QAxNm] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:15.828 DEBUG [XF5QAxNm] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:15.902 DEBUG [XF5QAxNm] [1] [        main] c.x.i.m.I.selectList_mpCount   : ==>  Preparing: SELECT COUNT(*) AS total FROM t_invite_config
15:17:15.903 DEBUG [XF5QAxNm] [1] [        main] c.x.i.m.I.selectList_mpCount   : ==> Parameters: 
15:17:15.906 DEBUG [XF5QAxNm] [1] [        main] c.x.i.m.I.selectList_mpCount   : <==      Total: 1
15:17:15.909 DEBUG [XF5QAxNm] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config ORDER BY create_time DESC LIMIT ?
15:17:15.910 DEBUG [XF5QAxNm] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 20(Long)
15:17:15.912 DEBUG [XF5QAxNm] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:15.917 DEBUG [XF5QAxNm] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/configs 200 95ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/invite/configs
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#listInviteConfigs(Integer, Integer)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"XF5QAxNm", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"records":[{"id":1,"rewardCrawlerCount":5,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":"https://download.example.com/app.exe","miniappPath":"/pages/download/index","miniappAppId":"wx1234567890","wechatRedirectUrl":"https://mp.weixin.qq.com/xxx","dingtalkAppId":"dingxxx","feishuAppId":"feishuxxx","landingTitle":"邀请你加入","landingDesc":"高效数据采集","appName":"智价云（药店版）","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter}，在这里发现了一个药店采购神器——{appName}！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册，你也会获得会员权益！","rewardDescription":"邀请人每成功邀请1家药店注册，赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店，{registeredCount}家注册，累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionApp":"下载安装客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序，邀请码已自动填入","instructionWechat":"关注公众号后，在菜单中输入邀请码：{code} 完成注册","instructionDingtalk":"打开钉钉应用，搜索\"{appName}\"并输入邀请码：{code}","instructionFeishu":"打开飞书应用，搜索\"{appName}\"并输入邀请码：{code}","instructionDefault":"下载客户端后，在注册页面输入邀请码：{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"}],"total":1,"size":20,"current":1,"pages":1},"timestamp":1782976635913}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:15.926 DEBUG [WDtEh5vm] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/config/1 | IP: 127.0.0.1
15:17:15.929 DEBUG [WDtEh5vm] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:15.929 DEBUG [WDtEh5vm] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:15.932 DEBUG [WDtEh5vm] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:15.934 DEBUG [WDtEh5vm] [1] [        main] c.x.i.m.I.selectById           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
15:17:15.935 DEBUG [WDtEh5vm] [1] [        main] c.x.i.m.I.selectById           : ==> Parameters: 1(Long)
15:17:15.938 DEBUG [WDtEh5vm] [1] [        main] c.x.i.m.I.selectById           : <==      Total: 1
15:17:15.940 DEBUG [WDtEh5vm] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/config/1 200 14ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/invite/config/1
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#getInviteConfigById(Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"WDtEh5vm", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":5,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":"https://download.example.com/app.exe","miniappPath":"/pages/download/index","miniappAppId":"wx1234567890","wechatRedirectUrl":"https://mp.weixin.qq.com/xxx","dingtalkAppId":"dingxxx","feishuAppId":"feishuxxx","landingTitle":"邀请你加入","landingDesc":"高效数据采集","appName":"智价云（药店版）","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter}，在这里发现了一个药店采购神器——{appName}！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册，你也会获得会员权益！","rewardDescription":"邀请人每成功邀请1家药店注册，赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店，{registeredCount}家注册，累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionApp":"下载安装客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序，邀请码已自动填入","instructionWechat":"关注公众号后，在菜单中输入邀请码：{code} 完成注册","instructionDingtalk":"打开钉钉应用，搜索\"{appName}\"并输入邀请码：{code}","instructionFeishu":"打开飞书应用，搜索\"{appName}\"并输入邀请码：{code}","instructionDefault":"下载客户端后，在注册页面输入邀请码：{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976635938}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:15.948 DEBUG [fNkx8ULs] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/config/99999 | IP: 127.0.0.1
15:17:15.950 DEBUG [fNkx8ULs] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:15.950 DEBUG [fNkx8ULs] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:15.953 DEBUG [fNkx8ULs] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:15.955 DEBUG [fNkx8ULs] [1] [        main] c.x.i.m.I.selectById           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
15:17:15.955 DEBUG [fNkx8ULs] [1] [        main] c.x.i.m.I.selectById           : ==> Parameters: 99999(Long)
15:17:15.956 DEBUG [fNkx8ULs] [1] [        main] c.x.i.m.I.selectById           : <==      Total: 0
15:17:15.960  WARN [fNkx8ULs] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=404, message=邀请配置不存在
15:17:15.961 DEBUG [fNkx8ULs] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/config/99999 200 13ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/invite/config/99999
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#getInviteConfigById(Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"fNkx8ULs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":404,"message":"邀请配置不存在","data":null,"timestamp":1782976635960}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:15.969 DEBUG [cDv3xdzq] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/crawler/grant | IP: 127.0.0.1
15:17:15.972 DEBUG [cDv3xdzq] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:15.972 DEBUG [cDv3xdzq] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:15.974 DEBUG [cDv3xdzq] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:15.985 DEBUG [cDv3xdzq] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:15.986 DEBUG [cDv3xdzq] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:15.987 DEBUG [cDv3xdzq] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:15.990 DEBUG [cDv3xdzq] [1] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_quota_grant ( id, user_id, grant_type, quota_count, used_count, remark, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:15.991 DEBUG [cDv3xdzq] [1] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580346656792577(Long), 1(Long), ADMIN(String), 50(Integer), 0(Integer), 测试发放(String), 1(Integer), 2026-07-02T15:17:15.989513300(LocalDateTime), 2026-07-02T15:17:15.989513300(LocalDateTime)
15:17:15.993 DEBUG [cDv3xdzq] [1] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:15.994  INFO [cDv3xdzq] [1] [        main] x.u.s.CrawlerQuotaGrantService : 爬虫配额发放: 用户=1, 类型=ADMIN, 次数=50, 过期=null, 备注=测试发放
15:17:16.000 DEBUG [cDv3xdzq] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:16.001 DEBUG [cDv3xdzq] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580346723901441(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:15.999762200(LocalDateTime), CRAWLER(String), QUOTA_GRANT(String), 手动发放爬虫配额(String), CRAWLER_QUOTA(String), 1(Long), CRAWLER_QUOTA:1(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:16.000289900(LocalDateTime)
15:17:16.005 DEBUG [cDv3xdzq] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:16.006  WARN [cDv3xdzq] [1] [        main] x.u.s.OperationAuditLogService : 【敏感操作】手动发放爬虫配额 - 操作人: 管理员(1), 目标: CRAWLER_QUOTA:1, 结果: SUCCESS
15:17:16.006 DEBUG [cDv3xdzq] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 手动发放爬虫配额
15:17:16.009 DEBUG [cDv3xdzq] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/crawler/grant 200 40ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/crawler/grant
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g", Content-Length:"94"]
             Body = {
    "userId": 1,
    "quotaCount": 50,
    "expireDays": 30,
    "remark": "测试发放"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#grantCrawlerQuota(QuotaGrantRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"cDv3xdzq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":2072580346656792577,"userId":1,"grantType":"ADMIN","quotaCount":50,"usedCount":0,"expireTime":null,"sourceUserId":null,"remark":"测试发放","status":1,"createTime":"2026-07-02 15:17:15","updateTime":"2026-07-02 15:17:15"},"timestamp":1782976636006}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.018 DEBUG [YuJMuqg4] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/invite/config | IP: 127.0.0.1
15:17:16.020 DEBUG [YuJMuqg4] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.020 DEBUG [YuJMuqg4] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.023 DEBUG [YuJMuqg4] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.029 DEBUG [YuJMuqg4] [1] [        main] c.x.i.m.I.insert               : ==>  Preparing: INSERT INTO t_invite_config ( reward_crawler_count, reward_type, reward_months, max_daily_reward, invite_code_expire_days, max_invite_per_day, max_total_invites, landing_title, landing_desc, app_name, status, share_title_template, copy_text_template, reward_description, summary_text_template, instruction_windows, instruction_app, instruction_miniapp, instruction_wechat, instruction_dingtalk, instruction_feishu, instruction_default, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:16.030 DEBUG [YuJMuqg4] [1] [        main] c.x.i.m.I.insert               : ==> Parameters: 3(Integer), MEMBERSHIP(String), 2(Integer), 30(Integer), 15(Integer), 5(Integer), 20(Integer), 新配置标题(String), 登录智价云（药店版），聚合比价查低价(String), 智价云（药店版）(String), 1(Integer), {inviter} 邀请你加入{appName}(String), 我是{inviter}，在这里发现了一个药店采购神器——{appName}！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册，你也会获得会员权益！(String), 邀请人每成功邀请1家药店注册，赠送1个月高级会员时长(String), 已邀请{totalInvited}家药店，{registeredCount}家注册，累计获得{totalReward}个月高级会员(String), 下载安装Windows客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入(String), 下载安装客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入(String), 点击按钮打开小程序，邀请码已自动填入(String), 关注公众号后，在菜单中输入邀请码：{code} 完成注册(String), 打开钉钉应用，搜索"{appName}"并输入邀请码：{code}(String), 打开飞书应用，搜索"{appName}"并输入邀请码：{code}(String), 下载客户端后，在注册页面输入邀请码：{code} 即可享受奖励(String), 2026-07-02T15:17:16.028702200(LocalDateTime), 2026-07-02T15:17:16.028702200(LocalDateTime)
15:17:16.035 DEBUG [YuJMuqg4] [1] [        main] c.x.i.m.I.insert               : <==    Updates: 1
15:17:16.037  INFO [YuJMuqg4] [1] [        main] c.x.i.s.InviteConfigService    : 创建邀请配置: id=2, rewardType=MEMBERSHIP, rewardMonths=2
15:17:16.038 DEBUG [YuJMuqg4] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:16.039 DEBUG [YuJMuqg4] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580346849730562(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:16.037481200(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 2(Long), INVITE_CONFIG_CREATE(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:16.037998700(LocalDateTime)
15:17:16.043 DEBUG [YuJMuqg4] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:16.044  WARN [YuJMuqg4] [1] [        main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG_CREATE, 结果: SUCCESS
15:17:16.044 DEBUG [YuJMuqg4] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
15:17:16.046 DEBUG [YuJMuqg4] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/invite/config 200 28ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/invite/config
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ", Content-Length:"280"]
             Body = {
    "rewardCrawlerCount": 3,
    "rewardType": "MEMBERSHIP",
    "rewardMonths": 2,
    "maxDailyReward": 30,
    "inviteCodeExpireDays": 15,
    "maxInvitePerDay": 5,
    "maxTotalInvites": 20,
    "landingTitle": "新配置标题",
    "appName": "智价云（药店版）"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#createInviteConfig(InviteConfigRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"YuJMuqg4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":2,"rewardCrawlerCount":3,"rewardType":"MEMBERSHIP","rewardMonths":2,"maxDailyReward":30,"inviteCodeExpireDays":15,"maxInvitePerDay":5,"maxTotalInvites":20,"appDownloadUrl":null,"miniappPath":null,"miniappAppId":null,"wechatRedirectUrl":null,"dingtalkAppId":null,"feishuAppId":null,"landingTitle":"新配置标题","landingDesc":"登录智价云（药店版），聚合比价查低价","appName":"智价云（药店版）","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter}，在这里发现了一个药店采购神器——{appName}！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册，你也会获得会员权益！","rewardDescription":"邀请人每成功邀请1家药店注册，赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店，{registeredCount}家注册，累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionApp":"下载安装客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序，邀请码已自动填入","instructionWechat":"关注公众号后，在菜单中输入邀请码：{code} 完成注册","instructionDingtalk":"打开钉钉应用，搜索\"{appName}\"并输入邀请码：{code}","instructionFeishu":"打开飞书应用，搜索\"{appName}\"并输入邀请码：{code}","instructionDefault":"下载客户端后，在注册页面输入邀请码：{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:16","updateTime":"2026-07-02 15:17:16"},"timestamp":1782976636044}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.051 DEBUG [2v65QrTh] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/crawler/grant | IP: 127.0.0.1
15:17:16.053  WARN [2v65QrTh] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/crawler/grant 401 2ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/crawler/grant
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"28"]
             Body = {"userId":1,"quotaCount":50}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"2v65QrTh", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976636052}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.060 DEBUG [NazCSJkw] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/invite/config/1 | IP: 127.0.0.1
15:17:16.062 DEBUG [NazCSJkw] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.063 DEBUG [NazCSJkw] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.065 DEBUG [NazCSJkw] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.068 DEBUG [NazCSJkw] [1] [        main] c.x.i.m.I.selectById           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
15:17:16.068 DEBUG [NazCSJkw] [1] [        main] c.x.i.m.I.selectById           : ==> Parameters: 1(Long)
15:17:16.070 DEBUG [NazCSJkw] [1] [        main] c.x.i.m.I.selectById           : <==      Total: 1
15:17:16.071 DEBUG [NazCSJkw] [1] [        main] c.x.i.m.I.updateById           : ==>  Preparing: UPDATE t_invite_config SET reward_crawler_count=?, reward_type=?, reward_months=?, max_daily_reward=?, invite_code_expire_days=?, max_invite_per_day=?, max_total_invites=?, app_download_url=?, miniapp_path=?, miniapp_app_id=?, wechat_redirect_url=?, dingtalk_app_id=?, feishu_app_id=?, landing_title=?, landing_desc=?, app_name=?, status=?, share_title_template=?, copy_text_template=?, reward_description=?, summary_text_template=?, instruction_windows=?, instruction_app=?, instruction_miniapp=?, instruction_wechat=?, instruction_dingtalk=?, instruction_feishu=?, instruction_default=?, create_time=?, update_time=? WHERE id=?
15:17:16.076 DEBUG [NazCSJkw] [1] [        main] c.x.i.m.I.updateById           : ==> Parameters: 5(Integer), MEMBERSHIP(String), 3(Integer), 50(Integer), 30(Integer), 10(Integer), 30(Integer), https://download.example.com/app.exe(String), /pages/download/index(String), wx1234567890(String), https://mp.weixin.qq.com/xxx(String), dingxxx(String), feishuxxx(String), 更新后的标题(String), 高效数据采集(String), 智价云（药店版）(String), 1(Integer), {inviter} 邀请你加入{appName}(String), 我是{inviter}，在这里发现了一个药店采购神器——{appName}！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册，你也会获得会员权益！(String), 邀请人每成功邀请1家药店注册，赠送1个月高级会员时长(String), 已邀请{totalInvited}家药店，{registeredCount}家注册，累计获得{totalReward}个月高级会员(String), 下载安装Windows客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入(String), 下载安装客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入(String), 点击按钮打开小程序，邀请码已自动填入(String), 关注公众号后，在菜单中输入邀请码：{code} 完成注册(String), 打开钉钉应用，搜索"{appName}"并输入邀请码：{code}(String), 打开飞书应用，搜索"{appName}"并输入邀请码：{code}(String), 下载客户端后，在注册页面输入邀请码：{code} 即可享受奖励(String), 2026-07-02T15:17:14(LocalDateTime), 2026-07-02T15:17:14(LocalDateTime), 1(Long)
15:17:16.081 DEBUG [NazCSJkw] [1] [        main] c.x.i.m.I.updateById           : <==    Updates: 1
15:17:16.081  INFO [NazCSJkw] [1] [        main] c.x.i.s.InviteConfigService    : 更新邀请配置: id=1, rewardType=MEMBERSHIP, rewardMonths=3
15:17:16.082 DEBUG [NazCSJkw] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:16.082 DEBUG [NazCSJkw] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580347042668545(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:16.081872300(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 1(Long), INVITE_CONFIG_UPDATE:1(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:16.082419400(LocalDateTime)
15:17:16.087 DEBUG [NazCSJkw] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:16.087  WARN [NazCSJkw] [1] [        main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG_UPDATE:1, 结果: SUCCESS
15:17:16.087 DEBUG [NazCSJkw] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
15:17:16.089 DEBUG [NazCSJkw] [1] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/invite/config/1 200 29ms

MockHttpServletRequest:
      HTTP Method = PUT
      Request URI = /api/admin/invite/config/1
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ", Content-Length:"68"]
             Body = {
    "rewardMonths": 3,
    "landingTitle": "更新后的标题"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#updateInviteConfigById(Long, InviteConfigRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"NazCSJkw", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":5,"rewardType":"MEMBERSHIP","rewardMonths":3,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":"https://download.example.com/app.exe","miniappPath":"/pages/download/index","miniappAppId":"wx1234567890","wechatRedirectUrl":"https://mp.weixin.qq.com/xxx","dingtalkAppId":"dingxxx","feishuAppId":"feishuxxx","landingTitle":"更新后的标题","landingDesc":"高效数据采集","appName":"智价云（药店版）","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter}，在这里发现了一个药店采购神器——{appName}！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册，你也会获得会员权益！","rewardDescription":"邀请人每成功邀请1家药店注册，赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店，{registeredCount}家注册，累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionApp":"下载安装客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序，邀请码已自动填入","instructionWechat":"关注公众号后，在菜单中输入邀请码：{code} 完成注册","instructionDingtalk":"打开钉钉应用，搜索\"{appName}\"并输入邀请码：{code}","instructionFeishu":"打开飞书应用，搜索\"{appName}\"并输入邀请码：{code}","instructionDefault":"下载客户端后，在注册页面输入邀请码：{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976636087}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.098 DEBUG [mAPZYCA9] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/grants | IP: 127.0.0.1
15:17:16.100 DEBUG [mAPZYCA9] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.100 DEBUG [mAPZYCA9] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.102 DEBUG [mAPZYCA9] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.105 DEBUG [mAPZYCA9] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id,user_id,grant_type,quota_count,used_count,expire_time,source_user_id,remark,status,create_time,update_time FROM t_crawler_quota_grant ORDER BY create_time DESC
15:17:16.105 DEBUG [mAPZYCA9] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: 
15:17:16.107 DEBUG [mAPZYCA9] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 1
15:17:16.108 DEBUG [mAPZYCA9] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/grants 200 10ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/crawler/grants
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#listGrants(Long, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"mAPZYCA9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":2072580346656792577,"userId":1,"grantType":"ADMIN","quotaCount":50,"usedCount":0,"expireTime":null,"sourceUserId":null,"remark":"测试发放","status":1,"createTime":"2026-07-02 15:17:16","updateTime":"2026-07-02 15:17:16"}],"timestamp":1782976636107}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.115 DEBUG [UvEFs9Cr] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/invite/config/99999 | IP: 127.0.0.1
15:17:16.116 DEBUG [UvEFs9Cr] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.117 DEBUG [UvEFs9Cr] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.119 DEBUG [UvEFs9Cr] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.121 DEBUG [UvEFs9Cr] [1] [        main] c.x.i.m.I.selectById           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
15:17:16.121 DEBUG [UvEFs9Cr] [1] [        main] c.x.i.m.I.selectById           : ==> Parameters: 99999(Long)
15:17:16.122 DEBUG [UvEFs9Cr] [1] [        main] c.x.i.m.I.selectById           : <==      Total: 0
15:17:16.123  WARN [UvEFs9Cr] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=404, message=邀请配置不存在
15:17:16.124 DEBUG [UvEFs9Cr] [1] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/invite/config/99999 200 10ms

MockHttpServletRequest:
      HTTP Method = PUT
      Request URI = /api/admin/invite/config/99999
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ", Content-Length:"19"]
             Body = {"rewardMonths": 3}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#updateInviteConfigById(Long, InviteConfigRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"UvEFs9Cr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":404,"message":"邀请配置不存在","data":null,"timestamp":1782976636123}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.130 DEBUG [dvg2GNxZ] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/invite/config | IP: 127.0.0.1
15:17:16.132 DEBUG [dvg2GNxZ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.133 DEBUG [dvg2GNxZ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.134 DEBUG [dvg2GNxZ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.136 DEBUG [dvg2GNxZ] [1] [        main] c.x.i.m.I.insert               : ==>  Preparing: INSERT INTO t_invite_config ( reward_crawler_count, reward_type, reward_months, max_daily_reward, invite_code_expire_days, max_invite_per_day, max_total_invites, landing_title, landing_desc, app_name, status, share_title_template, copy_text_template, reward_description, summary_text_template, instruction_windows, instruction_app, instruction_miniapp, instruction_wechat, instruction_dingtalk, instruction_feishu, instruction_default, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:16.137 DEBUG [dvg2GNxZ] [1] [        main] c.x.i.m.I.insert               : ==> Parameters: 0(Integer), MEMBERSHIP(String), 1(Integer), 50(Integer), 30(Integer), 10(Integer), 30(Integer), 待删除配置(String), 登录智价云（药店版），聚合比价查低价(String), 智价云（药店版）(String), 1(Integer), {inviter} 邀请你加入{appName}(String), 我是{inviter}，在这里发现了一个药店采购神器——{appName}！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册，你也会获得会员权益！(String), 邀请人每成功邀请1家药店注册，赠送1个月高级会员时长(String), 已邀请{totalInvited}家药店，{registeredCount}家注册，累计获得{totalReward}个月高级会员(String), 下载安装Windows客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入(String), 下载安装客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入(String), 点击按钮打开小程序，邀请码已自动填入(String), 关注公众号后，在菜单中输入邀请码：{code} 完成注册(String), 打开钉钉应用，搜索"{appName}"并输入邀请码：{code}(String), 打开飞书应用，搜索"{appName}"并输入邀请码：{code}(String), 下载客户端后，在注册页面输入邀请码：{code} 即可享受奖励(String), 2026-07-02T15:17:16.136861100(LocalDateTime), 2026-07-02T15:17:16.136861100(LocalDateTime)
15:17:16.142 DEBUG [dvg2GNxZ] [1] [        main] c.x.i.m.I.insert               : <==    Updates: 1
15:17:16.142  INFO [dvg2GNxZ] [1] [        main] c.x.i.s.InviteConfigService    : 创建邀请配置: id=3, rewardType=MEMBERSHIP, rewardMonths=1
15:17:16.144 DEBUG [dvg2GNxZ] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:16.144 DEBUG [dvg2GNxZ] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580347298521089(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:16.143202700(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 3(Long), INVITE_CONFIG_CREATE(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:16.144267500(LocalDateTime)
15:17:16.148 DEBUG [dvg2GNxZ] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:16.148  WARN [dvg2GNxZ] [1] [        main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG_CREATE, 结果: SUCCESS
15:17:16.149 DEBUG [dvg2GNxZ] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
15:17:16.150 DEBUG [dvg2GNxZ] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/invite/config 200 20ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/invite/config
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ", Content-Length:"65"]
             Body = {
    "rewardMonths": 1,
    "landingTitle": "待删除配置"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#createInviteConfig(InviteConfigRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"dvg2GNxZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":3,"rewardCrawlerCount":0,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":null,"miniappPath":null,"miniappAppId":null,"wechatRedirectUrl":null,"dingtalkAppId":null,"feishuAppId":null,"landingTitle":"待删除配置","landingDesc":"登录智价云（药店版），聚合比价查低价","appName":"智价云（药店版）","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter}，在这里发现了一个药店采购神器——{appName}！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册，你也会获得会员权益！","rewardDescription":"邀请人每成功邀请1家药店注册，赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店，{registeredCount}家注册，累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionApp":"下载安装客户端后，在注册页面输入邀请码：{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序，邀请码已自动填入","instructionWechat":"关注公众号后，在菜单中输入邀请码：{code} 完成注册","instructionDingtalk":"打开钉钉应用，搜索\"{appName}\"并输入邀请码：{code}","instructionFeishu":"打开飞书应用，搜索\"{appName}\"并输入邀请码：{code}","instructionDefault":"下载客户端后，在注册页面输入邀请码：{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:16","updateTime":"2026-07-02 15:17:16"},"timestamp":1782976636149}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.156 DEBUG [wU6NaWCQ] [] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/admin/invite/config/3 | IP: 127.0.0.1
15:17:16.160 DEBUG [wU6NaWCQ] [1] [        main] c.x.i.m.I.selectById           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
15:17:16.160 DEBUG [wU6NaWCQ] [1] [        main] c.x.i.m.I.selectById           : ==> Parameters: 3(Long)
15:17:16.162 DEBUG [wU6NaWCQ] [1] [        main] c.x.i.m.I.selectById           : <==      Total: 1
15:17:16.164 DEBUG [wU6NaWCQ] [1] [        main] c.x.i.m.I.deleteById           : ==>  Preparing: DELETE FROM t_invite_config WHERE id=?
15:17:16.164 DEBUG [wU6NaWCQ] [1] [        main] c.x.i.m.I.deleteById           : ==> Parameters: 3(Long)
15:17:16.168 DEBUG [wU6NaWCQ] [1] [        main] c.x.i.m.I.deleteById           : <==    Updates: 1
15:17:16.169  INFO [wU6NaWCQ] [1] [        main] c.x.i.s.InviteConfigService    : 删除邀请配置: id=3
15:17:16.169 DEBUG [wU6NaWCQ] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:16.170 DEBUG [wU6NaWCQ] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580347428544513(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:16.169215(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 3(Long), INVITE_CONFIG_DELETE:3(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:16.169753900(LocalDateTime)
15:17:16.175 DEBUG [wU6NaWCQ] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:16.175  WARN [wU6NaWCQ] [1] [        main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG_DELETE:3, 结果: SUCCESS
15:17:16.175 DEBUG [wU6NaWCQ] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
15:17:16.176 DEBUG [wU6NaWCQ] [1] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/admin/invite/config/3 200 20ms

MockHttpServletRequest:
      HTTP Method = DELETE
      Request URI = /api/admin/invite/config/3
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#deleteInviteConfig(Long, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"wU6NaWCQ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976636175}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.179 DEBUG [fawATnUx] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/config/3 | IP: 127.0.0.1
15:17:16.182 DEBUG [fawATnUx] [1] [        main] c.x.i.m.I.selectById           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
15:17:16.183 DEBUG [fawATnUx] [1] [        main] c.x.i.m.I.selectById           : ==> Parameters: 3(Long)
15:17:16.184 DEBUG [fawATnUx] [1] [        main] c.x.i.m.I.selectById           : <==      Total: 0
15:17:16.185  WARN [fawATnUx] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=404, message=邀请配置不存在
15:17:16.186 DEBUG [fawATnUx] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/config/3 200 7ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/invite/config/3
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#getInviteConfigById(Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"fawATnUx", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":404,"message":"邀请配置不存在","data":null,"timestamp":1782976636185}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.198 DEBUG [sRsK3Bvh] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/grants?userId=1 | IP: 127.0.0.1
15:17:16.200 DEBUG [sRsK3Bvh] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.200 DEBUG [sRsK3Bvh] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.202 DEBUG [sRsK3Bvh] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.205 DEBUG [sRsK3Bvh] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id,user_id,grant_type,quota_count,used_count,expire_time,source_user_id,remark,status,create_time,update_time FROM t_crawler_quota_grant WHERE (user_id = ?) ORDER BY create_time DESC
15:17:16.205 DEBUG [sRsK3Bvh] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: 1(Long)
15:17:16.207 DEBUG [sRsK3Bvh] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 1
15:17:16.208 DEBUG [sRsK3Bvh] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/grants?userId=1 200 11ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/crawler/grants
       Parameters = {userId=[1]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#listGrants(Long, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"sRsK3Bvh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":2072580346656792577,"userId":1,"grantType":"ADMIN","quotaCount":50,"usedCount":0,"expireTime":null,"sourceUserId":null,"remark":"测试发放","status":1,"createTime":"2026-07-02 15:17:16","updateTime":"2026-07-02 15:17:16"}],"timestamp":1782976636207}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.217 DEBUG [8Zm5EJRs] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/grants?grantType=ADMIN | IP: 127.0.0.1
15:17:16.220 DEBUG [8Zm5EJRs] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.220 DEBUG [8Zm5EJRs] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.222 DEBUG [8Zm5EJRs] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.228 DEBUG [8Zm5EJRs] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id,user_id,grant_type,quota_count,used_count,expire_time,source_user_id,remark,status,create_time,update_time FROM t_crawler_quota_grant WHERE (grant_type = ?) ORDER BY create_time DESC
15:17:16.229 DEBUG [8Zm5EJRs] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: ADMIN(String)
15:17:16.231 DEBUG [8Zm5EJRs] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 1
15:17:16.232 DEBUG [8Zm5EJRs] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/grants?grantType=ADMIN 200 15ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/crawler/grants
       Parameters = {grantType=[ADMIN]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#listGrants(Long, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"8Zm5EJRs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":2072580346656792577,"userId":1,"grantType":"ADMIN","quotaCount":50,"usedCount":0,"expireTime":null,"sourceUserId":null,"remark":"测试发放","status":1,"createTime":"2026-07-02 15:17:16","updateTime":"2026-07-02 15:17:16"}],"timestamp":1782976636231}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.241 DEBUG [6KGQUg83] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/grants?grantType=INVITE | IP: 127.0.0.1
15:17:16.242 DEBUG [6KGQUg83] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.244 DEBUG [6KGQUg83] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.246 DEBUG [6KGQUg83] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.248 DEBUG [6KGQUg83] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id,user_id,grant_type,quota_count,used_count,expire_time,source_user_id,remark,status,create_time,update_time FROM t_crawler_quota_grant WHERE (grant_type = ?) ORDER BY create_time DESC
15:17:16.248 DEBUG [6KGQUg83] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: INVITE(String)
15:17:16.250 DEBUG [6KGQUg83] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:16.251 DEBUG [6KGQUg83] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/grants?grantType=INVITE 200 10ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/crawler/grants
       Parameters = {grantType=[INVITE]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#listGrants(Long, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"6KGQUg83", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976636250}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.259 DEBUG [bnHwSmgV] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/grants?grantType=PURCHASE | IP: 127.0.0.1
15:17:16.262 DEBUG [bnHwSmgV] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.262 DEBUG [bnHwSmgV] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.268 DEBUG [bnHwSmgV] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.270 DEBUG [bnHwSmgV] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id,user_id,grant_type,quota_count,used_count,expire_time,source_user_id,remark,status,create_time,update_time FROM t_crawler_quota_grant WHERE (grant_type = ?) ORDER BY create_time DESC
15:17:16.270 DEBUG [bnHwSmgV] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: PURCHASE(String)
15:17:16.272 DEBUG [bnHwSmgV] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:16.274 DEBUG [bnHwSmgV] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/grants?grantType=PURCHASE 200 15ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/crawler/grants
       Parameters = {grantType=[PURCHASE]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#listGrants(Long, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"bnHwSmgV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976636273}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.286 DEBUG [9F5pxKKv] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/rewards?userId=1 | IP: 127.0.0.1
15:17:16.288 DEBUG [9F5pxKKv] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.288 DEBUG [9F5pxKKv] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.292 DEBUG [9F5pxKKv] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.294 DEBUG [9F5pxKKv] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?) ORDER BY create_time DESC
15:17:16.295 DEBUG [9F5pxKKv] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long)
15:17:16.297 DEBUG [9F5pxKKv] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:17:16.299 DEBUG [9F5pxKKv] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/rewards?userId=1 200 13ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/invite/rewards
       Parameters = {userId=[1]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#listInviteRewards(Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"9F5pxKKv", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976636298}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.307 DEBUG [hngD3H9Z] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/rewards | IP: 127.0.0.1
15:17:16.310 DEBUG [hngD3H9Z] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.310 DEBUG [hngD3H9Z] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.312 DEBUG [hngD3H9Z] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.316 DEBUG [hngD3H9Z] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/rewards 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/invite/rewards
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#listInviteRewards(Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"hngD3H9Z", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976636313}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.321 DEBUG [LdgkvbTT] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/rewards | IP: 127.0.0.1
15:17:16.325  WARN [LdgkvbTT] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/rewards 401 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/invite/rewards
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"LdgkvbTT", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976636323}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.332 DEBUG [bc33J4JU] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/user-detail?userId=1 | IP: 127.0.0.1
15:17:16.334 DEBUG [bc33J4JU] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.334 DEBUG [bc33J4JU] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.336 DEBUG [bc33J4JU] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.338 DEBUG [bc33J4JU] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.338 DEBUG [bc33J4JU] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.340 DEBUG [bc33J4JU] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.340 DEBUG [bc33J4JU] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:16.340 DEBUG [bc33J4JU] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:16.343 DEBUG [bc33J4JU] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:16.343 DEBUG [bc33J4JU] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:16.343 DEBUG [bc33J4JU] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:16.345 DEBUG [bc33J4JU] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:16.346 DEBUG [bc33J4JU] [1] [        main] .u.m.C.sumTodayUsageByPlatform : ==>  Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as today_usage FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE() GROUP BY platform
15:17:16.346 DEBUG [bc33J4JU] [1] [        main] .u.m.C.sumTodayUsageByPlatform : ==> Parameters: 1(Long)
15:17:16.348 DEBUG [bc33J4JU] [1] [        main] .u.m.C.sumTodayUsageByPlatform : <==      Total: 0
15:17:16.349 DEBUG [bc33J4JU] [1] [        main] .m.C.sumMonthlyUsageByPlatform : ==>  Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as monthly_usage FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE()) GROUP BY platform
15:17:16.349 DEBUG [bc33J4JU] [1] [        main] .m.C.sumMonthlyUsageByPlatform : ==> Parameters: 1(Long)
15:17:16.351 DEBUG [bc33J4JU] [1] [        main] .m.C.sumMonthlyUsageByPlatform : <==      Total: 0
15:17:16.352 DEBUG [bc33J4JU] [1] [        main] .u.m.C.sumTotalUsageByPlatform : ==>  Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as total_usage FROM t_crawler_usage_log WHERE user_id = ? GROUP BY platform
15:17:16.352 DEBUG [bc33J4JU] [1] [        main] .u.m.C.sumTotalUsageByPlatform : ==> Parameters: 1(Long)
15:17:16.354 DEBUG [bc33J4JU] [1] [        main] .u.m.C.sumTotalUsageByPlatform : <==      Total: 0
15:17:16.357 DEBUG [bc33J4JU] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/user-detail?userId=1 200 25ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/crawler/user-detail
       Parameters = {userId=[1]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#getCrawlerUserDetail(Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"bc33J4JU", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"nickname":"测试用户","phone":"138****8000","todayTotalUsage":0,"monthlyTotalUsage":0,"platformStats":[]},"timestamp":1782976636355}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.365 DEBUG [B6Zfqyac] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/user-detail?userId=1 | IP: 127.0.0.1
15:17:16.367 DEBUG [B6Zfqyac] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.368 DEBUG [B6Zfqyac] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.369 DEBUG [B6Zfqyac] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.371 DEBUG [B6Zfqyac] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.371 DEBUG [B6Zfqyac] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.373 DEBUG [B6Zfqyac] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.374 DEBUG [B6Zfqyac] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:16.374 DEBUG [B6Zfqyac] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:16.375 DEBUG [B6Zfqyac] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:16.376 DEBUG [B6Zfqyac] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:16.376 DEBUG [B6Zfqyac] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:16.377 DEBUG [B6Zfqyac] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:16.378 DEBUG [B6Zfqyac] [1] [        main] .u.m.C.sumTodayUsageByPlatform : ==>  Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as today_usage FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE() GROUP BY platform
15:17:16.378 DEBUG [B6Zfqyac] [1] [        main] .u.m.C.sumTodayUsageByPlatform : ==> Parameters: 1(Long)
15:17:16.379 DEBUG [B6Zfqyac] [1] [        main] .u.m.C.sumTodayUsageByPlatform : <==      Total: 0
15:17:16.380 DEBUG [B6Zfqyac] [1] [        main] .m.C.sumMonthlyUsageByPlatform : ==>  Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as monthly_usage FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE()) GROUP BY platform
15:17:16.381 DEBUG [B6Zfqyac] [1] [        main] .m.C.sumMonthlyUsageByPlatform : ==> Parameters: 1(Long)
15:17:16.382 DEBUG [B6Zfqyac] [1] [        main] .m.C.sumMonthlyUsageByPlatform : <==      Total: 0
15:17:16.383 DEBUG [B6Zfqyac] [1] [        main] .u.m.C.sumTotalUsageByPlatform : ==>  Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as total_usage FROM t_crawler_usage_log WHERE user_id = ? GROUP BY platform
15:17:16.383 DEBUG [B6Zfqyac] [1] [        main] .u.m.C.sumTotalUsageByPlatform : ==> Parameters: 1(Long)
15:17:16.384 DEBUG [B6Zfqyac] [1] [        main] .u.m.C.sumTotalUsageByPlatform : <==      Total: 0
15:17:16.386 DEBUG [B6Zfqyac] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/user-detail?userId=1 200 21ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/crawler/user-detail
       Parameters = {userId=[1]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#getCrawlerUserDetail(Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"B6Zfqyac", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"nickname":"测试用户","phone":"138****8000","todayTotalUsage":0,"monthlyTotalUsage":0,"platformStats":[]},"timestamp":1782976636385}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.394 DEBUG [8LyLGwu9] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/user-detail?userId=1 | IP: 127.0.0.1
15:17:16.396 DEBUG [8LyLGwu9] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.396 DEBUG [8LyLGwu9] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.398 DEBUG [8LyLGwu9] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.399 DEBUG [8LyLGwu9] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.400 DEBUG [8LyLGwu9] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.401 DEBUG [8LyLGwu9] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.402 DEBUG [8LyLGwu9] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:16.402 DEBUG [8LyLGwu9] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:16.403 DEBUG [8LyLGwu9] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:16.403 DEBUG [8LyLGwu9] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:16.403 DEBUG [8LyLGwu9] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:16.404 DEBUG [8LyLGwu9] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:16.405 DEBUG [8LyLGwu9] [1] [        main] .u.m.C.sumTodayUsageByPlatform : ==>  Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as today_usage FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE() GROUP BY platform
15:17:16.405 DEBUG [8LyLGwu9] [1] [        main] .u.m.C.sumTodayUsageByPlatform : ==> Parameters: 1(Long)
15:17:16.406 DEBUG [8LyLGwu9] [1] [        main] .u.m.C.sumTodayUsageByPlatform : <==      Total: 0
15:17:16.406 DEBUG [8LyLGwu9] [1] [        main] .m.C.sumMonthlyUsageByPlatform : ==>  Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as monthly_usage FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE()) GROUP BY platform
15:17:16.407 DEBUG [8LyLGwu9] [1] [        main] .m.C.sumMonthlyUsageByPlatform : ==> Parameters: 1(Long)
15:17:16.407 DEBUG [8LyLGwu9] [1] [        main] .m.C.sumMonthlyUsageByPlatform : <==      Total: 0
15:17:16.407 DEBUG [8LyLGwu9] [1] [        main] .u.m.C.sumTotalUsageByPlatform : ==>  Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as total_usage FROM t_crawler_usage_log WHERE user_id = ? GROUP BY platform
15:17:16.408 DEBUG [8LyLGwu9] [1] [        main] .u.m.C.sumTotalUsageByPlatform : ==> Parameters: 1(Long)
15:17:16.409 DEBUG [8LyLGwu9] [1] [        main] .u.m.C.sumTotalUsageByPlatform : <==      Total: 0
15:17:16.410 DEBUG [8LyLGwu9] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/user-detail?userId=1 200 16ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/crawler/user-detail
       Parameters = {userId=[1]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#getCrawlerUserDetail(Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"8LyLGwu9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"nickname":"测试用户","phone":"138****8000","todayTotalUsage":0,"monthlyTotalUsage":0,"platformStats":[]},"timestamp":1782976636409}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.414 DEBUG [2MWUw8mC] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/user-detail?userId=1 | IP: 127.0.0.1
15:17:16.417  WARN [2MWUw8mC] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/user-detail?userId=1 401 3ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/crawler/user-detail
       Parameters = {userId=[1]}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"2MWUw8mC", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976636415}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.424 DEBUG [YmJkmgxx] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/user-detail?userId=999 | IP: 127.0.0.1
15:17:16.426 DEBUG [YmJkmgxx] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.427 DEBUG [YmJkmgxx] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.429 DEBUG [YmJkmgxx] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.430 DEBUG [YmJkmgxx] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.431 DEBUG [YmJkmgxx] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 999(Long)
15:17:16.433 DEBUG [YmJkmgxx] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 0
15:17:16.434  WARN [YmJkmgxx] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=1001, message=用户不存在
15:17:16.435 DEBUG [YmJkmgxx] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/user-detail?userId=999 200 11ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/crawler/user-detail
       Parameters = {userId=[999]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#getCrawlerUserDetail(Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"YmJkmgxx", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":1001,"message":"用户不存在","data":null,"timestamp":1782976636434}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.442 DEBUG [GhzxNaDh] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/conversion-stats?userId=1 | IP: 127.0.0.1
15:17:16.444 DEBUG [GhzxNaDh] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.444 DEBUG [GhzxNaDh] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.446 DEBUG [GhzxNaDh] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.450 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
15:17:16.450 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:17:16.449071500(LocalDateTime)
15:17:16.452 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:17:16.453 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:17:16.453 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:17:16.455 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 2
15:17:16.457 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectCount          : ==>  Preparing: SELECT COUNT( * ) AS total FROM t_invite_code WHERE (code = ?)
15:17:16.457 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectCount          : ==> Parameters: ZXHS9WYB(String)
15:17:16.459 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectCount          : <==      Total: 1
15:17:16.460 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.insert               : ==>  Preparing: INSERT INTO t_invite_code ( user_id, code, max_uses, used_count, click_count, expire_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:16.460 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.insert               : ==> Parameters: 1(Long), ZXHS9WYB(String), -1(Integer), 0(Integer), 0(Integer), 2026-08-01T15:17:16.455971100(LocalDateTime), 1(Integer), 2026-07-02T15:17:16.460059700(LocalDateTime), 2026-07-02T15:17:16.460059700(LocalDateTime)
15:17:16.464 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.insert               : <==    Updates: 1
15:17:16.465  INFO [GhzxNaDh] [1] [        main] c.x.i.service.InviteService    : 用户 1 创建邀请码: ZXHS9WYB
15:17:16.465 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:17:16.465 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:17:16.467 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 2
15:17:16.467 DEBUG [GhzxNaDh] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.467 DEBUG [GhzxNaDh] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.470 DEBUG [GhzxNaDh] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.477 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND code = ?)
15:17:16.478 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long), ZXHS9WYB(String)
15:17:16.479 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:16.480 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
15:17:16.480 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long)
15:17:16.481 DEBUG [GhzxNaDh] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:17:16.487 DEBUG [GhzxNaDh] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/conversion-stats?userId=1 200 45ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/invite/conversion-stats
       Parameters = {userId=[1]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#getInviteConversionStats(Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"GhzxNaDh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"inviteCode":"ZXHS9WYB","clickedCount":0,"totalInvited":0,"registeredCount":0,"pendingCount":0,"conversionRate":0.0,"totalReward":0},"timestamp":1782976636483}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.496 DEBUG [8wtcvYkL] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/conversion-stats?userId=1 | IP: 127.0.0.1
15:17:16.498 DEBUG [8wtcvYkL] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.498 DEBUG [8wtcvYkL] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.499 DEBUG [8wtcvYkL] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.502 DEBUG [8wtcvYkL] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
15:17:16.502 DEBUG [8wtcvYkL] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:17:16.501339600(LocalDateTime)
15:17:16.504 DEBUG [8wtcvYkL] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:16.505 DEBUG [8wtcvYkL] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:17:16.505 DEBUG [8wtcvYkL] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:17:16.508 DEBUG [8wtcvYkL] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 2
15:17:16.508 DEBUG [8wtcvYkL] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.508 DEBUG [8wtcvYkL] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.511 DEBUG [8wtcvYkL] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.512 DEBUG [8wtcvYkL] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND code = ?)
15:17:16.512 DEBUG [8wtcvYkL] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long), ZXHS9WYB(String)
15:17:16.513 DEBUG [8wtcvYkL] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:16.515 DEBUG [8wtcvYkL] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
15:17:16.515 DEBUG [8wtcvYkL] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long)
15:17:16.516 DEBUG [8wtcvYkL] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:17:16.518 DEBUG [8wtcvYkL] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/conversion-stats?userId=1 200 22ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/invite/conversion-stats
       Parameters = {userId=[1]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#getInviteConversionStats(Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"8wtcvYkL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"inviteCode":"ZXHS9WYB","clickedCount":0,"totalInvited":0,"registeredCount":0,"pendingCount":0,"conversionRate":0.0,"totalReward":0},"timestamp":1782976636517}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.527 DEBUG [zt4ALaK7] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/conversion-stats?userId=1 | IP: 127.0.0.1
15:17:16.529 DEBUG [zt4ALaK7] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.529 DEBUG [zt4ALaK7] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.531 DEBUG [zt4ALaK7] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.533 DEBUG [zt4ALaK7] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
15:17:16.533 DEBUG [zt4ALaK7] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:17:16.532948600(LocalDateTime)
15:17:16.535 DEBUG [zt4ALaK7] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:16.536 DEBUG [zt4ALaK7] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:17:16.536 DEBUG [zt4ALaK7] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:17:16.539 DEBUG [zt4ALaK7] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 2
15:17:16.540 DEBUG [zt4ALaK7] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:16.540 DEBUG [zt4ALaK7] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:16.542 DEBUG [zt4ALaK7] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:16.543 DEBUG [zt4ALaK7] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND code = ?)
15:17:16.543 DEBUG [zt4ALaK7] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long), ZXHS9WYB(String)
15:17:16.545 DEBUG [zt4ALaK7] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:16.545 DEBUG [zt4ALaK7] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
15:17:16.545 DEBUG [zt4ALaK7] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long)
15:17:16.547 DEBUG [zt4ALaK7] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:17:16.548 DEBUG [zt4ALaK7] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/conversion-stats?userId=1 200 21ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/invite/conversion-stats
       Parameters = {userId=[1]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.AdminController
           Method = com.xuekairui.invite.controller.AdminController#getInviteConversionStats(Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"zt4ALaK7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"inviteCode":"ZXHS9WYB","clickedCount":0,"totalInvited":0,"registeredCount":0,"pendingCount":0,"conversionRate":0.0,"totalReward":0},"timestamp":1782976636547}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:16.553 DEBUG [gedevtrF] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/conversion-stats?userId=1 | IP: 127.0.0.1
15:17:16.554  WARN [gedevtrF] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/conversion-stats?userId=1 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/invite/conversion-stats
       Parameters = {userId=[1]}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"gedevtrF", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976636554}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 14.50 s -- in 运营管理接口测试
[INFO] Running 营业执照审核管理接口测试
15:17:16.564  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.AdminLicenseTest]: AdminLicenseTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:17:16.566  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.AdminLicenseTest
15:17:19.688 DEBUG [W3QF8V8z] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/business-license/upload | IP: 127.0.0.1
15:17:19.689 DEBUG [W3QF8V8z] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:19.690 DEBUG [W3QF8V8z] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:19.692 DEBUG [W3QF8V8z] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:19.697 DEBUG [W3QF8V8z] [1] [        main] c.x.u.m.B.selectByUserId       : ==>  Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
15:17:19.697 DEBUG [W3QF8V8z] [1] [        main] c.x.u.m.B.selectByUserId       : ==> Parameters: 1(Long)
15:17:19.700 DEBUG [W3QF8V8z] [1] [        main] c.x.u.m.B.selectByUserId       : <==      Total: 0
15:17:19.702 DEBUG [W3QF8V8z] [1] [        main] c.x.u.m.B.insert               : ==>  Preparing: INSERT INTO t_business_license ( user_id, license_image_url, credit_code, pharmacy_name, legal_person, review_status, show_verified_badge, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:19.703 DEBUG [W3QF8V8z] [1] [        main] c.x.u.m.B.insert               : ==> Parameters: 1(Long), https://oss.example.com/license/review-test.jpg(String), 91110000MA12345678(String), 审核测试大药房(String), 李四(String), PENDING(String), false(Boolean), 2026-07-02T15:17:19.702277400(LocalDateTime), 2026-07-02T15:17:19.702277400(LocalDateTime)
15:17:19.708 DEBUG [W3QF8V8z] [1] [        main] c.x.u.m.B.insert               : <==    Updates: 1
15:17:19.709 DEBUG [W3QF8V8z] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/business-license/upload 200 21ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/business-license/upload
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"191"]
             Body = {
    "licenseImageUrl": "https://oss.example.com/license/review-test.jpg",
    "creditCode": "91110000MA12345678",
    "pharmacyName": "审核测试大药房",
    "legalPerson": "李四"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.BusinessLicenseController
           Method = com.xuekairui.user.controller.BusinessLicenseController#upload(UploadRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"W3QF8V8z", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976639708}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:19.716 DEBUG [eteEALJE] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/license/review | IP: 127.0.0.1
15:17:19.717 DEBUG [eteEALJE] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:19.717 DEBUG [eteEALJE] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:19.720 DEBUG [eteEALJE] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:19.722 DEBUG [eteEALJE] [1] [        main] c.x.u.m.B.selectList           : ==>  Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE (review_status = ?) ORDER BY create_time DESC
15:17:19.722 DEBUG [eteEALJE] [1] [        main] c.x.u.m.B.selectList           : ==> Parameters: PENDING(String)
15:17:19.724 DEBUG [eteEALJE] [1] [        main] c.x.u.m.B.selectList           : <==      Total: 1
15:17:19.727 DEBUG [eteEALJE] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/license/review 200 11ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/license/review
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminLicenseController
           Method = com.xuekairui.user.controller.AdminLicenseController#listPendingReviews(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"eteEALJE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"userId":1,"licenseImageUrl":"https://oss.example.com/license/review-test.jpg","creditCode":"91110000MA12345678","pharmacyName":"审核测试大药房","legalPerson":"李四","registeredAddress":null,"businessScope":null,"validFrom":null,"validTo":null,"reviewStatus":"PENDING","reviewerId":null,"reviewTime":null,"rejectReason":null,"showVerifiedBadge":false,"remark":null,"createTime":"2026-07-02 15:17:20","updateTime":"2026-07-02 15:17:20"}],"timestamp":1782976639725}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:19.732 DEBUG [Cd5cRJYk] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/license/review?reviewStatus=PENDING | IP: 127.0.0.1
15:17:19.735 DEBUG [Cd5cRJYk] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:19.735 DEBUG [Cd5cRJYk] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:19.737 DEBUG [Cd5cRJYk] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:19.738 DEBUG [Cd5cRJYk] [1] [        main] c.x.u.m.B.selectList           : ==>  Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE (review_status = ?) ORDER BY create_time DESC
15:17:19.738 DEBUG [Cd5cRJYk] [1] [        main] c.x.u.m.B.selectList           : ==> Parameters: PENDING(String)
15:17:19.740 DEBUG [Cd5cRJYk] [1] [        main] c.x.u.m.B.selectList           : <==      Total: 1
15:17:19.741 DEBUG [Cd5cRJYk] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/license/review?reviewStatus=PENDING 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/license/review
       Parameters = {reviewStatus=[PENDING]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminLicenseController
           Method = com.xuekairui.user.controller.AdminLicenseController#listPendingReviews(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Cd5cRJYk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"userId":1,"licenseImageUrl":"https://oss.example.com/license/review-test.jpg","creditCode":"91110000MA12345678","pharmacyName":"审核测试大药房","legalPerson":"李四","registeredAddress":null,"businessScope":null,"validFrom":null,"validTo":null,"reviewStatus":"PENDING","reviewerId":null,"reviewTime":null,"rejectReason":null,"showVerifiedBadge":false,"remark":null,"createTime":"2026-07-02 15:17:20","updateTime":"2026-07-02 15:17:20"}],"timestamp":1782976639740}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:19.749 DEBUG [UDpvyY8r] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/license/review?reviewStatus=APPROVED | IP: 127.0.0.1
15:17:19.750 DEBUG [UDpvyY8r] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:19.750 DEBUG [UDpvyY8r] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:19.752 DEBUG [UDpvyY8r] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:19.754 DEBUG [UDpvyY8r] [1] [        main] c.x.u.m.B.selectList           : ==>  Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE (review_status = ?) ORDER BY create_time DESC
15:17:19.754 DEBUG [UDpvyY8r] [1] [        main] c.x.u.m.B.selectList           : ==> Parameters: APPROVED(String)
15:17:19.757 DEBUG [UDpvyY8r] [1] [        main] c.x.u.m.B.selectList           : <==      Total: 0
15:17:19.758 DEBUG [UDpvyY8r] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/license/review?reviewStatus=APPROVED 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/license/review
       Parameters = {reviewStatus=[APPROVED]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminLicenseController
           Method = com.xuekairui.user.controller.AdminLicenseController#listPendingReviews(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"UDpvyY8r", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976639757}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:19.765 DEBUG [A8rHA8Lp] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/license/review?reviewStatus=REJECTED | IP: 127.0.0.1
15:17:19.767 DEBUG [A8rHA8Lp] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:19.767 DEBUG [A8rHA8Lp] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:19.769 DEBUG [A8rHA8Lp] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:19.771 DEBUG [A8rHA8Lp] [1] [        main] c.x.u.m.B.selectList           : ==>  Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE (review_status = ?) ORDER BY create_time DESC
15:17:19.771 DEBUG [A8rHA8Lp] [1] [        main] c.x.u.m.B.selectList           : ==> Parameters: REJECTED(String)
15:17:19.773 DEBUG [A8rHA8Lp] [1] [        main] c.x.u.m.B.selectList           : <==      Total: 0
15:17:19.774 DEBUG [A8rHA8Lp] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/license/review?reviewStatus=REJECTED 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/license/review
       Parameters = {reviewStatus=[REJECTED]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminLicenseController
           Method = com.xuekairui.user.controller.AdminLicenseController#listPendingReviews(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"A8rHA8Lp", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976639773}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:19.778 DEBUG [hRGUqmGh] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/license/review | IP: 127.0.0.1
15:17:19.780  WARN [hRGUqmGh] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/license/review 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/license/review
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"hRGUqmGh", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976639779}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:19.787 DEBUG [zntcy4CM] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review | IP: 127.0.0.1
15:17:19.789 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:19.790 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:19.792 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:19.796 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.B.selectById           : ==>  Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE id=?
15:17:19.797 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.B.selectById           : ==> Parameters: 1(Long)
15:17:19.799 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.B.selectById           : <==      Total: 1
15:17:19.801 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.B.selectCount          : ==>  Preparing: SELECT COUNT( * ) AS total FROM t_business_license WHERE (user_id = ? AND review_status = ? AND id <> ?)
15:17:19.801 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.B.selectCount          : ==> Parameters: 1(Long), APPROVED(String), 1(Long)
15:17:19.803 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.B.selectCount          : <==      Total: 1
15:17:19.805 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:19.805 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:19.808 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:19.809 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:19.809 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:19.811 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:19.812 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
15:17:19.812 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long), 1(Integer)
15:17:19.815 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 0
15:17:19.816 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.U.insert               : ==>  Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, effective_to, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:19.816 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.U.insert               : ==> Parameters: 2072580362733559809(Long), 1(Long), PRO(String), LICENSE(String), 2026-07-02T15:17:19.815124(LocalDateTime), 2026-08-01T15:17:19.815124(LocalDateTime), 1(Integer), 营业执照审核通过赠送30天高级会员(String), 2026-07-02T15:17:19.816202700(LocalDateTime), 2026-07-02T15:17:19.816202700(LocalDateTime)
15:17:19.819 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.U.insert               : <==    Updates: 1
15:17:19.822 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, token_version=?, create_time=?, update_time=? WHERE id=?
15:17:19.822 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:17:19.815124(LocalDateTime), 0(Long), 2026-07-02T15:17:19(LocalDateTime), 2026-07-02T15:17:19(LocalDateTime), 1(Long)
15:17:19.825 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:17:19.830  INFO [zntcy4CM] [1] [        main] c.x.u.c.AdminLicenseController : 营业执照审核通过，赠送用户1 30天高级会员
15:17:19.831 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.B.updateById           : ==>  Preparing: UPDATE t_business_license SET user_id=?, license_image_url=?, credit_code=?, pharmacy_name=?, legal_person=?, review_status=?, reviewer_id=?, review_time=?, show_verified_badge=?, create_time=?, update_time=? WHERE id=?
15:17:19.831 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.B.updateById           : ==> Parameters: 1(Long), https://oss.example.com/license/review-test.jpg(String), 91110000MA12345678(String), 审核测试大药房(String), 李四(String), APPROVED(String), 1(Long), 2026-07-02T15:17:19.830129500(LocalDateTime), true(Boolean), 2026-07-02T15:17:20(LocalDateTime), 2026-07-02T15:17:20(LocalDateTime), 1(Long)
15:17:19.837 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.B.updateById           : <==    Updates: 1
15:17:19.837  INFO [zntcy4CM] [1] [        main] c.x.u.c.AdminLicenseController : 营业执照审核完成: licenseId=1, action=APPROVED, reviewerId=1
15:17:19.839 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:19.840 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580362800668673(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:19.837659700(LocalDateTime), LICENSE(String), APPROVE(String), 审核营业执照（通过）(String), LICENSE(String), 1(Long), LICENSE:1(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:19.839290300(LocalDateTime)
15:17:19.845 DEBUG [zntcy4CM] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:19.845  WARN [zntcy4CM] [1] [        main] x.u.s.OperationAuditLogService : 【敏感操作】审核营业执照（通过） - 操作人: 管理员(1), 目标: LICENSE:1, 结果: SUCCESS
15:17:19.845 DEBUG [zntcy4CM] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 审核营业执照（通过）
15:17:19.847 DEBUG [zntcy4CM] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review 200 60ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/license/review
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"49"]
             Body = {
    "licenseId": 1,
    "action": "APPROVED"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminLicenseController
           Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"zntcy4CM", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976639846}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:19.853 DEBUG [HP6CLQJy] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review | IP: 127.0.0.1
15:17:19.853 DEBUG [HP6CLQJy] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:19.855 DEBUG [HP6CLQJy] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:19.857 DEBUG [HP6CLQJy] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:19.859 DEBUG [HP6CLQJy] [1] [        main] c.x.u.m.B.selectById           : ==>  Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE id=?
15:17:19.859 DEBUG [HP6CLQJy] [1] [        main] c.x.u.m.B.selectById           : ==> Parameters: 1(Long)
15:17:19.861 DEBUG [HP6CLQJy] [1] [        main] c.x.u.m.B.selectById           : <==      Total: 1
15:17:19.862 DEBUG [HP6CLQJy] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review 200 9ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/license/review
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"49"]
             Body = {
    "licenseId": 1,
    "action": "APPROVED"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminLicenseController
           Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"HP6CLQJy", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"该营业执照已审核，无法重复操作","data":null,"timestamp":1782976639861}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:19.869 DEBUG [a9cBADze] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review | IP: 127.0.0.1
15:17:19.870 DEBUG [a9cBADze] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:19.870 DEBUG [a9cBADze] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:19.872 DEBUG [a9cBADze] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:19.874 DEBUG [a9cBADze] [1] [        main] c.x.u.m.B.selectById           : ==>  Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE id=?
15:17:19.874 DEBUG [a9cBADze] [1] [        main] c.x.u.m.B.selectById           : ==> Parameters: 9999(Long)
15:17:19.876 DEBUG [a9cBADze] [1] [        main] c.x.u.m.B.selectById           : <==      Total: 0
15:17:19.877 DEBUG [a9cBADze] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review 200 8ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/license/review
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"52"]
             Body = {
    "licenseId": 9999,
    "action": "APPROVED"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminLicenseController
           Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"a9cBADze", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":404,"message":"营业执照记录不存在","data":null,"timestamp":1782976639876}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:19.884 DEBUG [zaeSjGPj] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review | IP: 127.0.0.1
15:17:19.885 DEBUG [zaeSjGPj] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:19.885 DEBUG [zaeSjGPj] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:19.888 DEBUG [zaeSjGPj] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:19.894  WARN [zaeSjGPj] [1] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 审核动作不能为空
15:17:19.898  WARN [zaeSjGPj] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review 400 14ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/license/review
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"23"]
             Body = {
    "licenseId": 1
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminLicenseController
           Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"zaeSjGPj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"审核动作不能为空","data":null,"timestamp":1782976639894}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:19.906 DEBUG [AehShErK] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review | IP: 127.0.0.1
15:17:19.908 DEBUG [AehShErK] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:19.909 DEBUG [AehShErK] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:19.910 DEBUG [AehShErK] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:19.912  WARN [AehShErK] [1] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 营业执照ID不能为空
15:17:19.913  WARN [AehShErK] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review 400 7ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/license/review
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"29"]
             Body = {
    "action": "APPROVED"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminLicenseController
           Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"AehShErK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"营业执照ID不能为空","data":null,"timestamp":1782976639912}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:19.920 DEBUG [JZz75DCC] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review | IP: 127.0.0.1
15:17:19.921 DEBUG [JZz75DCC] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:19.921 DEBUG [JZz75DCC] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:19.924 DEBUG [JZz75DCC] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:19.926 DEBUG [JZz75DCC] [1] [        main] c.x.u.m.B.selectById           : ==>  Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE id=?
15:17:19.926 DEBUG [JZz75DCC] [1] [        main] c.x.u.m.B.selectById           : ==> Parameters: 1(Long)
15:17:19.928 DEBUG [JZz75DCC] [1] [        main] c.x.u.m.B.selectById           : <==      Total: 1
15:17:19.929 DEBUG [JZz75DCC] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review 200 9ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/license/review
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"55"]
             Body = {
    "licenseId": 1,
    "action": "INVALID_ACTION"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminLicenseController
           Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"JZz75DCC", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"该营业执照已审核，无法重复操作","data":null,"timestamp":1782976639928}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:19.936 DEBUG [xgZwQxRs] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/business-license/upload | IP: 127.0.0.1
15:17:19.938 DEBUG [xgZwQxRs] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:19.938 DEBUG [xgZwQxRs] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:19.941 DEBUG [xgZwQxRs] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:19.942 DEBUG [xgZwQxRs] [2] [        main] c.x.u.m.B.selectByUserId       : ==>  Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
15:17:19.942 DEBUG [xgZwQxRs] [2] [        main] c.x.u.m.B.selectByUserId       : ==> Parameters: 2(Long)
15:17:19.944 DEBUG [xgZwQxRs] [2] [        main] c.x.u.m.B.selectByUserId       : <==      Total: 0
15:17:19.945 DEBUG [xgZwQxRs] [2] [        main] c.x.u.m.B.insert               : ==>  Preparing: INSERT INTO t_business_license ( user_id, license_image_url, credit_code, pharmacy_name, legal_person, review_status, show_verified_badge, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:19.945 DEBUG [xgZwQxRs] [2] [        main] c.x.u.m.B.insert               : ==> Parameters: 2(Long), https://oss.example.com/license/reject-test.jpg(String), 91110000MA87654321(String), 拒绝测试药房(String), 王五(String), PENDING(String), false(Boolean), 2026-07-02T15:17:19.945305500(LocalDateTime), 2026-07-02T15:17:19.945305500(LocalDateTime)
15:17:19.950 DEBUG [xgZwQxRs] [2] [        main] c.x.u.m.B.insert               : <==    Updates: 1
15:17:19.952 DEBUG [xgZwQxRs] [2] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/business-license/upload 200 16ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/business-license/upload
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.wASNXjbYJawq1JLMKuHV07q7BI5ujDRaggX0qeCVnhjkotwlk8pR4Jhf-HIc1V7rE9fJiGUewBiqMb9qCj-80w", Content-Length:"188"]
             Body = {
    "licenseImageUrl": "https://oss.example.com/license/reject-test.jpg",
    "creditCode": "91110000MA87654321",
    "pharmacyName": "拒绝测试药房",
    "legalPerson": "王五"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.BusinessLicenseController
           Method = com.xuekairui.user.controller.BusinessLicenseController#upload(UploadRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"xgZwQxRs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976639951}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:19.955 DEBUG [VP8B3MU8] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review | IP: 127.0.0.1
15:17:19.956 DEBUG [VP8B3MU8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:19.957 DEBUG [VP8B3MU8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:19.958 DEBUG [VP8B3MU8] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:19.960 DEBUG [VP8B3MU8] [1] [        main] c.x.u.m.B.selectById           : ==>  Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE id=?
15:17:19.960 DEBUG [VP8B3MU8] [1] [        main] c.x.u.m.B.selectById           : ==> Parameters: 2(Long)
15:17:19.962 DEBUG [VP8B3MU8] [1] [        main] c.x.u.m.B.selectById           : <==      Total: 1
15:17:19.963 DEBUG [VP8B3MU8] [1] [        main] c.x.u.m.B.updateById           : ==>  Preparing: UPDATE t_business_license SET user_id=?, license_image_url=?, credit_code=?, pharmacy_name=?, legal_person=?, review_status=?, reviewer_id=?, review_time=?, reject_reason=?, show_verified_badge=?, create_time=?, update_time=? WHERE id=?
15:17:19.963 DEBUG [VP8B3MU8] [1] [        main] c.x.u.m.B.updateById           : ==> Parameters: 2(Long), https://oss.example.com/license/reject-test.jpg(String), 91110000MA87654321(String), 拒绝测试药房(String), 王五(String), REJECTED(String), 1(Long), 2026-07-02T15:17:19.962838300(LocalDateTime), 营业执照图片不清晰，请重新上传(String), false(Boolean), 2026-07-02T15:17:20(LocalDateTime), 2026-07-02T15:17:20(LocalDateTime), 2(Long)
15:17:19.969 DEBUG [VP8B3MU8] [1] [        main] c.x.u.m.B.updateById           : <==    Updates: 1
15:17:19.969  INFO [VP8B3MU8] [1] [        main] c.x.u.c.AdminLicenseController : 营业执照审核完成: licenseId=2, action=REJECTED, reviewerId=1
15:17:19.969 DEBUG [VP8B3MU8] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:19.970 DEBUG [VP8B3MU8] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580363375288321(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:19.969695100(LocalDateTime), LICENSE(String), REJECT(String), 审核营业执照（驳回）(String), LICENSE(String), 2(Long), LICENSE:2(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:19.969695100(LocalDateTime)
15:17:19.975 DEBUG [VP8B3MU8] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:19.975  WARN [VP8B3MU8] [1] [        main] x.u.s.OperationAuditLogService : 【敏感操作】审核营业执照（驳回） - 操作人: 管理员(1), 目标: LICENSE:2, 结果: SUCCESS
15:17:19.975 DEBUG [VP8B3MU8] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 审核营业执照（驳回）
15:17:19.976 DEBUG [VP8B3MU8] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review 200 21ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/license/review
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"118"]
             Body = {
    "licenseId": 2,
    "action": "REJECTED",
    "rejectReason": "营业执照图片不清晰，请重新上传"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminLicenseController
           Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"VP8B3MU8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976639975}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:19.980 DEBUG [k4AmgMGh] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review | IP: 127.0.0.1
15:17:19.984  WARN [k4AmgMGh] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review 401 4ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/license/review
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"35"]
             Body = {"licenseId":1,"action":"APPROVED"}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"k4AmgMGh", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976639981}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.423 s -- in 营业执照审核管理接口测试
[INFO] Running 认证接口测试
15:17:19.988  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.AuthControllerTest]: AuthControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:17:19.991  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.AuthControllerTest
15:17:23.183 DEBUG [pGPbQ8bg] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send | IP: 127.0.0.1
15:17:23.200  WARN [pGPbQ8bg] [] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 手机号格式不正确
15:17:23.202  WARN [pGPbQ8bg] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send 400 19ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/send
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"31"]
             Body = {"phone":"123","scene":"login"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"pGPbQ8bg", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"手机号格式不正确","data":null,"timestamp":1782976643200}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:23.207 DEBUG [Vxj6UchZ] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send | IP: 127.0.0.1
15:17:23.212  WARN [Vxj6UchZ] [] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 场景参数不正确
15:17:23.215  WARN [Vxj6UchZ] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send 400 8ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/send
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"41"]
             Body = {"phone":"13800138000","scene":"invalid"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"Vxj6UchZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"场景参数不正确","data":null,"timestamp":1782976643212}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:23.227 DEBUG [kg6SHZMx] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send | IP: 127.0.0.1
15:17:23.231  WARN [kg6SHZMx] [] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 手机号不能为空, 场景不能为空
15:17:23.233  WARN [kg6SHZMx] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send 400 6ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/send
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
             Body = {}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"kg6SHZMx", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"手机号不能为空, 场景不能为空","data":null,"timestamp":1782976643231}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:23.242 DEBUG [3kRA9yWY] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send | IP: 127.0.0.1
15:17:23.245  WARN [3kRA9yWY] [] [        main] c.x.h.GlobalExceptionHandler   : 请求体解析失败: JSON parse error: Unexpected character ('i' (code 105)): was expecting double-quote to start field name
15:17:23.246  WARN [3kRA9yWY] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send 400 4ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/send
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"14"]
             Body = {invalid json}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.http.converter.HttpMessageNotReadableException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"3kRA9yWY", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"请求体格式错误","data":null,"timestamp":1782976643245}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:23.252 DEBUG [zbZL4Mhm] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send | IP: 127.0.0.1
15:17:23.254  WARN [zbZL4Mhm] [] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 手机号不能为空, 手机号格式不正确
15:17:23.255  WARN [zbZL4Mhm] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send 400 3ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/send
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"28"]
             Body = {"phone":"","scene":"login"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"zbZL4Mhm", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"手机号不能为空, 手机号格式不正确","data":null,"timestamp":1782976643254}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:23.261 DEBUG [9cuUq8xa] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send | IP: 127.0.0.1
15:17:23.262  INFO [9cuUq8xa] [] [        main] .x.u.s.VerificationCodeService : 【验证码-测试模式】是否启用 true
15:17:24.390  INFO [9cuUq8xa] [] [        main] .x.u.s.VerificationCodeService : 【验证码-测试模式】手机号: 138****8000, 验证码: 123456 (固定), 场景: login, 有效期: 5分钟
15:17:24.392  WARN [9cuUq8xa] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send 200 1131ms SLOW

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/send
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","scene":"login"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"9cuUq8xa", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976644390}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.403 DEBUG [Jb2pUWbJ] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:17:24.414  WARN [Jb2pUWbJ] [] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 验证码必须为6位数字
15:17:24.417  WARN [Jb2pUWbJ] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 400 14ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/smsc/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"36"]
             Body = {"phone":"13800138000","code":"123"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"Jb2pUWbJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"验证码必须为6位数字","data":null,"timestamp":1782976644415}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.428 DEBUG [RKzNsXPz] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:17:24.490  WARN [RKzNsXPz] [] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=1102, message=验证码错误或已过期
15:17:24.492 DEBUG [RKzNsXPz] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 64ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","code":"000000"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"RKzNsXPz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":1102,"message":"验证码错误或已过期","data":null,"timestamp":1782976644490}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.500 DEBUG [nHJNesYZ] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:17:24.503  WARN [nHJNesYZ] [] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 手机号不能为空, 验证码不能为空
15:17:24.504  WARN [nHJNesYZ] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 400 4ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
             Body = {}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"nHJNesYZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"手机号不能为空, 验证码不能为空","data":null,"timestamp":1782976644503}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.509 DEBUG [tbeAphLL] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:17:24.512  WARN [tbeAphLL] [] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 手机号格式不正确
15:17:24.513  WARN [tbeAphLL] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 400 4ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"31"]
             Body = {"phone":"123","code":"123456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"tbeAphLL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"手机号格式不正确","data":null,"timestamp":1782976644512}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.520 DEBUG [cT4g62cq] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:17:24.534  WARN [cT4g62cq] [] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=1102, message=验证码错误或已过期
15:17:24.535 DEBUG [cT4g62cq] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 15ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"61"]
             Body = {"phone":"13800138000","code":"000000","inviteCode":"ABC123"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"cT4g62cq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":1102,"message":"验证码错误或已过期","data":null,"timestamp":1782976644534}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.543 DEBUG [GZv2XxD5] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/wechat/url | IP: 127.0.0.1
15:17:24.546 DEBUG [GZv2XxD5] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/wechat/url 200 3ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/wechat/url
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#getWechatUrl(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"GZv2XxD5", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":"https://open.weixin.qq.com/connect/qrconnect?appid=test_app_id&redirect_uri=http://localhost/callback&response_type=code&scope=snsapi_login&state=login#wechat_redirect","timestamp":1782976644545}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.556 DEBUG [SqPJdmV7] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/wechat/url?state=custom_state | IP: 127.0.0.1
15:17:24.560 DEBUG [SqPJdmV7] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/wechat/url?state=custom_state 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/wechat/url
       Parameters = {state=[custom_state]}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#getWechatUrl(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"SqPJdmV7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":"https://open.weixin.qq.com/connect/qrconnect?appid=test_app_id&redirect_uri=http://localhost/callback&response_type=code&scope=snsapi_login&state=custom_state#wechat_redirect","timestamp":1782976644559}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.569 DEBUG [WHJCCZEV] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/wechat/callback | IP: 127.0.0.1
15:17:24.574 DEBUG [WHJCCZEV] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/wechat/callback 200 5ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/wechat/callback
       Parameters = {code=[test_code], state=[login]}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#wechatCallback(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"WHJCCZEV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":"https://your-domain.com/wechat-login?code=test_code","timestamp":1782976644572}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.581 DEBUG [wRWSAc4N] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/wechat/login | IP: 127.0.0.1
15:17:24.588  WARN [wRWSAc4N] [] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 授权码不能为空
15:17:24.589  WARN [wRWSAc4N] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/wechat/login 400 9ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/wechat/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
             Body = {}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#wechatLogin(WechatLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"wRWSAc4N", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"授权码不能为空","data":null,"timestamp":1782976644588}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.595 DEBUG [PKPEjKFs] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/wechat/bind | IP: 127.0.0.1
15:17:24.603  WARN [PKPEjKFs] [] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 验证码不能为空, 手机号不能为空, 临时令牌不能为空
15:17:24.605  WARN [PKPEjKFs] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/wechat/bind 400 10ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/wechat/bind
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
             Body = {}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#wechatBind(WechatBindRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"PKPEjKFs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"验证码不能为空, 手机号不能为空, 临时令牌不能为空","data":null,"timestamp":1782976644603}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.619 DEBUG [Z3awMk9N] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info | IP: 127.0.0.1
15:17:24.620 DEBUG [Z3awMk9N] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:24.620 DEBUG [Z3awMk9N] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:24.624 DEBUG [Z3awMk9N] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:24.626 DEBUG [Z3awMk9N] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:24.626 DEBUG [Z3awMk9N] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:24.629 DEBUG [Z3awMk9N] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:24.631 DEBUG [Z3awMk9N] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:24.631 DEBUG [Z3awMk9N] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:24.635 DEBUG [Z3awMk9N] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:24.636 DEBUG [Z3awMk9N] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:24.636 DEBUG [Z3awMk9N] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:24.640 DEBUG [Z3awMk9N] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:24.644 DEBUG [Z3awMk9N] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:24.645 DEBUG [Z3awMk9N] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:24.649 DEBUG [Z3awMk9N] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:24.658 DEBUG [Z3awMk9N] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info 200 39ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/user/info
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDQsImV4cCI6MTc4MzA2MzA0NH0.wiVzmckqvuV9e3DWmdEK5mofBpDHjYbGyFsFAdByiL3_WYqvIBowpWsFKCifPj63_hI0oNkO-qNhKSXmaLTIuQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#getUserInfo(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Z3awMk9N", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:17:22","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"timestamp":1782976644651}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.664 DEBUG [88xsVdaF] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info | IP: 127.0.0.1
15:17:24.667  WARN [88xsVdaF] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info 401 3ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/user/info
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"88xsVdaF", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976644665}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.674 DEBUG [kK7ZX6Bz] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info | IP: 127.0.0.1
15:17:24.698 DEBUG [kK7ZX6Bz] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:24.699 DEBUG [kK7ZX6Bz] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:24.710 DEBUG [kK7ZX6Bz] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:24.711 DEBUG [kK7ZX6Bz] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:24.712 DEBUG [kK7ZX6Bz] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:24.714 DEBUG [kK7ZX6Bz] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:24.714 DEBUG [kK7ZX6Bz] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:24.715 DEBUG [kK7ZX6Bz] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:24.717 DEBUG [kK7ZX6Bz] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:24.718 DEBUG [kK7ZX6Bz] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:24.718 DEBUG [kK7ZX6Bz] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:24.720 DEBUG [kK7ZX6Bz] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:24.721 DEBUG [kK7ZX6Bz] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:24.721 DEBUG [kK7ZX6Bz] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:24.724 DEBUG [kK7ZX6Bz] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:24.726 DEBUG [kK7ZX6Bz] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info 200 52ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/user/info
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJwaG9uZSI6IjEzODAwMTM4MDAwIiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4MjgwMzg0NCwiZXhwIjoxNzgyODkwMjQ0fQ.VTKAD6i2z7RYXEF7pNHYnoE_U1fmxYRtBRgI3KZi4oyL3KERN9Z1uCNsc_jbLrtyJNguyQAp302P8DNEi1MlWQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#getUserInfo(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"kK7ZX6Bz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:17:22","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"timestamp":1782976644725}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/user/info
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJwaG9uZSI6IjEzODAwMTM4MDAwIiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4MjgwMzg0NCwiZXhwIjoxNzgyODkwMjQ0fQ.VTKAD6i2z7RYXEF7pNHYnoE_U1fmxYRtBRgI3KZi4oyL3KERN9Z1uCNsc_jbLrtyJNguyQAp302P8DNEi1MlWQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#getUserInfo(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"kK7ZX6Bz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:17:22","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"timestamp":1782976644725}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.746 DEBUG [JVvGBn4s] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info | IP: 127.0.0.1
15:17:24.749  WARN [JVvGBn4s] [] [        main] c.xuekairui.user.util.JwtUtil  : JWT解析TokenLenient失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4.  Found: 3
15:17:24.750  WARN [JVvGBn4s] [] [        main] c.xuekairui.user.util.JwtUtil  : JWT解析TokenLenient失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4.  Found: 3
15:17:24.750  WARN [JVvGBn4s] [] [        main] .x.u.s.JwtAuthenticationFilter : JWT认证失败: Token无效
15:17:24.753  WARN [JVvGBn4s] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info 401 7ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/user/info
       Parameters = {}
          Headers = [Authorization:"Bearer not.a.valid.jwt"]
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"JVvGBn4s", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976644751}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.763 DEBUG [4MxmwV4S] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info | IP: 127.0.0.1
15:17:24.766  WARN [4MxmwV4S] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info 401 3ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/user/info
       Parameters = {}
          Headers = [Authorization:"Bearer "]
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"4MxmwV4S", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976644764}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.782 DEBUG [Wq4gpETA] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info | IP: 127.0.0.1
15:17:24.785  WARN [Wq4gpETA] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info 401 3ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/user/info
       Parameters = {}
          Headers = [Authorization:"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDQsImV4cCI6MTc4MzA2MzA0NH0.wiVzmckqvuV9e3DWmdEK5mofBpDHjYbGyFsFAdByiL3_WYqvIBowpWsFKCifPj63_hI0oNkO-qNhKSXmaLTIuQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"Wq4gpETA", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976644783}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:24.792 DEBUG [c9t3xmwH] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/refresh | IP: 127.0.0.1
15:17:24.801  WARN [c9t3xmwH] [] [        main] c.xuekairui.user.util.JwtUtil  : JWT解析Token失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4.  Found: 0
15:17:24.807  WARN [c9t3xmwH] [] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=1302, message=Token无效
15:17:24.809 DEBUG [c9t3xmwH] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/refresh 200 17ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/refresh
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"40"]
             Body = {"refreshToken":"invalid_refresh_token"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#refreshToken(RefreshTokenRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"c9t3xmwH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":1302,"message":"Token无效","data":null,"timestamp":1782976644807}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[ERROR] Tests run: 23, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 4.833 s <<< FAILURE! -- in 认证接口测试
[ERROR] com.xuekairui.gateway.AuthControllerTest.getUserInfo_withExpiredToken_shouldReturn401 -- Time elapsed: 0.064 s <<< FAILURE!
java.lang.AssertionError: Status expected:<401> but was:<200>
	at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:61)
	at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:128)
	at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:640)
	at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214)
	at com.xuekairui.gateway.AuthControllerTest.getUserInfo_withExpiredToken_shouldReturn401(AuthControllerTest.java:222)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)

[INFO] Running 营业执照和优惠券模块测试
15:17:24.828  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.BusinessLicenseAndCouponTest]: BusinessLicenseAndCouponTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:17:24.835  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.BusinessLicenseAndCouponTest
15:17:29.848 DEBUG [sTjhRXRH] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/business-license/upload | IP: 127.0.0.1
15:17:29.850 DEBUG [sTjhRXRH] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:29.850 DEBUG [sTjhRXRH] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:29.852 DEBUG [sTjhRXRH] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:29.853 DEBUG [sTjhRXRH] [1] [        main] c.x.u.m.B.selectByUserId       : ==>  Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
15:17:29.853 DEBUG [sTjhRXRH] [1] [        main] c.x.u.m.B.selectByUserId       : ==> Parameters: 1(Long)
15:17:29.856 DEBUG [sTjhRXRH] [1] [        main] c.x.u.m.B.selectByUserId       : <==      Total: 0
15:17:29.857 DEBUG [sTjhRXRH] [1] [        main] c.x.u.m.B.insert               : ==>  Preparing: INSERT INTO t_business_license ( user_id, license_image_url, credit_code, pharmacy_name, legal_person, review_status, show_verified_badge, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:29.858 DEBUG [sTjhRXRH] [1] [        main] c.x.u.m.B.insert               : ==> Parameters: 1(Long), https://oss.example.com/license/test.jpg(String), 91110000XXXXXXXXXX(String), 测试大药房(String), 张三(String), PENDING(String), false(Boolean), 2026-07-02T15:17:29.857501800(LocalDateTime), 2026-07-02T15:17:29.857501800(LocalDateTime)
15:17:29.863 DEBUG [sTjhRXRH] [1] [        main] c.x.u.m.B.insert               : <==    Updates: 1
15:17:29.864 DEBUG [sTjhRXRH] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/business-license/upload 200 16ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/business-license/upload
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw", Content-Length:"178"]
             Body = {
    "licenseImageUrl": "https://oss.example.com/license/test.jpg",
    "creditCode": "91110000XXXXXXXXXX",
    "pharmacyName": "测试大药房",
    "legalPerson": "张三"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.BusinessLicenseController
           Method = com.xuekairui.user.controller.BusinessLicenseController#upload(UploadRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"sTjhRXRH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976649863}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:29.872 DEBUG [ZRAFWTWL] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/business-license/upload | IP: 127.0.0.1
15:17:29.874 DEBUG [ZRAFWTWL] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:29.874 DEBUG [ZRAFWTWL] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:29.876 DEBUG [ZRAFWTWL] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:29.879  WARN [ZRAFWTWL] [1] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 统一社会信用代码不能为空, 执照图片URL不能为空
15:17:29.880  WARN [ZRAFWTWL] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/business-license/upload 400 8ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/business-license/upload
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw", Content-Length:"42"]
             Body = {
    "pharmacyName": "测试大药房"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.BusinessLicenseController
           Method = com.xuekairui.user.controller.BusinessLicenseController#upload(UploadRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"ZRAFWTWL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"统一社会信用代码不能为空, 执照图片URL不能为空","data":null,"timestamp":1782976649879}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:29.884 DEBUG [Q6mj4CqU] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/business-license/upload | IP: 127.0.0.1
15:17:29.889  WARN [Q6mj4CqU] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/business-license/upload 401 5ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/business-license/upload
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
             Body = {}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"Q6mj4CqU", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976649887}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:29.905 DEBUG [KEapBTD4] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/business-license/info | IP: 127.0.0.1
15:17:29.907 DEBUG [KEapBTD4] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:29.908 DEBUG [KEapBTD4] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:29.912 DEBUG [KEapBTD4] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:29.915 DEBUG [KEapBTD4] [1] [        main] c.x.u.m.B.selectByUserId       : ==>  Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
15:17:29.915 DEBUG [KEapBTD4] [1] [        main] c.x.u.m.B.selectByUserId       : ==> Parameters: 1(Long)
15:17:29.920 DEBUG [KEapBTD4] [1] [        main] c.x.u.m.B.selectByUserId       : <==      Total: 1
15:17:29.922 DEBUG [KEapBTD4] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/business-license/info 200 18ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/business-license/info
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.BusinessLicenseController
           Method = com.xuekairui.user.controller.BusinessLicenseController#getInfo(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"KEapBTD4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"userId":1,"licenseImageUrl":"https://oss.example.com/license/test.jpg","creditCode":"91110000XXXXXXXXXX","pharmacyName":"测试大药房","legalPerson":"张三","registeredAddress":null,"businessScope":null,"validFrom":null,"validTo":null,"reviewStatus":"PENDING","reviewerId":null,"reviewTime":null,"rejectReason":null,"showVerifiedBadge":false,"remark":null,"createTime":"2026-07-02 15:17:30","updateTime":"2026-07-02 15:17:30"},"timestamp":1782976649920}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:29.930 DEBUG [FMDxc9tZ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/business-license/info | IP: 127.0.0.1
15:17:29.932 DEBUG [FMDxc9tZ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:29.932 DEBUG [FMDxc9tZ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:29.935 DEBUG [FMDxc9tZ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:29.937 DEBUG [FMDxc9tZ] [1] [        main] c.x.u.m.B.selectByUserId       : ==>  Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
15:17:29.937 DEBUG [FMDxc9tZ] [1] [        main] c.x.u.m.B.selectByUserId       : ==> Parameters: 1(Long)
15:17:29.940 DEBUG [FMDxc9tZ] [1] [        main] c.x.u.m.B.selectByUserId       : <==      Total: 1
15:17:29.942 DEBUG [FMDxc9tZ] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/business-license/info 200 12ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/business-license/info
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.BusinessLicenseController
           Method = com.xuekairui.user.controller.BusinessLicenseController#getInfo(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"FMDxc9tZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"userId":1,"licenseImageUrl":"https://oss.example.com/license/test.jpg","creditCode":"91110000XXXXXXXXXX","pharmacyName":"测试大药房","legalPerson":"张三","registeredAddress":null,"businessScope":null,"validFrom":null,"validTo":null,"reviewStatus":"PENDING","reviewerId":null,"reviewTime":null,"rejectReason":null,"showVerifiedBadge":false,"remark":null,"createTime":"2026-07-02 15:17:30","updateTime":"2026-07-02 15:17:30"},"timestamp":1782976649940}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:29.950 DEBUG [4JkgHQJZ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/business-license/info | IP: 127.0.0.1
15:17:29.952  WARN [4JkgHQJZ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/business-license/info 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/business-license/info
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"4JkgHQJZ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976649951}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:29.960 DEBUG [9XuL78Cn] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my | IP: 127.0.0.1
15:17:29.962 DEBUG [9XuL78Cn] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:29.962 DEBUG [9XuL78Cn] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:29.965 DEBUG [9XuL78Cn] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:29.969 DEBUG [9XuL78Cn] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ?) ORDER BY create_time DESC
15:17:29.969 DEBUG [9XuL78Cn] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long)
15:17:29.975 DEBUG [9XuL78Cn] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 0
15:17:29.977 DEBUG [9XuL78Cn] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my 200 17ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CouponController
           Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"9XuL78Cn", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976649976}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:29.989 DEBUG [uuyG22fU] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my?status=0 | IP: 127.0.0.1
15:17:29.990 DEBUG [uuyG22fU] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:29.991 DEBUG [uuyG22fU] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:29.993 DEBUG [uuyG22fU] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:29.996 DEBUG [uuyG22fU] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
15:17:29.997 DEBUG [uuyG22fU] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long), 0(Integer)
15:17:29.999 DEBUG [uuyG22fU] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 0
15:17:30.001 DEBUG [uuyG22fU] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my?status=0 200 12ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my
       Parameters = {status=[0]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CouponController
           Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"uuyG22fU", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976650000}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:30.009 DEBUG [XR48RxdZ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my?status=1 | IP: 127.0.0.1
15:17:30.011 DEBUG [XR48RxdZ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:30.011 DEBUG [XR48RxdZ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:30.014 DEBUG [XR48RxdZ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:30.016 DEBUG [XR48RxdZ] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
15:17:30.016 DEBUG [XR48RxdZ] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long), 1(Integer)
15:17:30.018 DEBUG [XR48RxdZ] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 0
15:17:30.019 DEBUG [XR48RxdZ] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my?status=1 200 10ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my
       Parameters = {status=[1]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CouponController
           Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"XR48RxdZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976650018}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:30.027 DEBUG [nLChwG2E] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my?status=2 | IP: 127.0.0.1
15:17:30.029 DEBUG [nLChwG2E] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:30.029 DEBUG [nLChwG2E] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:30.031 DEBUG [nLChwG2E] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:30.033 DEBUG [nLChwG2E] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
15:17:30.033 DEBUG [nLChwG2E] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long), 2(Integer)
15:17:30.035 DEBUG [nLChwG2E] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 0
15:17:30.036 DEBUG [nLChwG2E] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my?status=2 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my
       Parameters = {status=[2]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CouponController
           Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"nLChwG2E", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976650035}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:30.040 DEBUG [5ktJWwfJ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my | IP: 127.0.0.1
15:17:30.042  WARN [5ktJWwfJ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"5ktJWwfJ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976650041}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:30.049 DEBUG [5NkH2D5s] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my/available?type=CRAWLER | IP: 127.0.0.1
15:17:30.051 DEBUG [5NkH2D5s] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:30.051 DEBUG [5NkH2D5s] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:30.053 DEBUG [5NkH2D5s] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:30.056 DEBUG [5NkH2D5s] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:17:30.056 DEBUG [5NkH2D5s] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:17:30.059 DEBUG [5NkH2D5s] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:30.060 DEBUG [5NkH2D5s] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ? AND expire_time > ?) ORDER BY expire_time ASC
15:17:30.060 DEBUG [5NkH2D5s] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long), 0(Integer), 2026-07-02T15:17:30.054906100(LocalDateTime)
15:17:30.063 DEBUG [5NkH2D5s] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 0
15:17:30.064 DEBUG [5NkH2D5s] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my/available?type=CRAWLER 200 15ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my/available
       Parameters = {type=[CRAWLER]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CouponController
           Method = com.xuekairui.user.controller.CouponController#listAvailableCoupons(HttpServletRequest, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"5NkH2D5s", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976650063}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:30.069 DEBUG [ZnFSE87G] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my/available | IP: 127.0.0.1
15:17:30.071  WARN [ZnFSE87G] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my/available 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my/available
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"ZnFSE87G", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976650070}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:30.077 DEBUG [ehbje4jx] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:30.080 DEBUG [ehbje4jx] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:30.080 DEBUG [ehbje4jx] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:30.084 DEBUG [ehbje4jx] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:30.085 DEBUG [ehbje4jx] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:30.085 DEBUG [ehbje4jx] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:30.088 DEBUG [ehbje4jx] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:30.091 DEBUG [ehbje4jx] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:30.091 DEBUG [ehbje4jx] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:30.096 DEBUG [ehbje4jx] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:30.101 DEBUG [ehbje4jx] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 24ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ehbje4jx", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976650096}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:30.108 DEBUG [HRCvFUyR] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:30.110 DEBUG [HRCvFUyR] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:30.110 DEBUG [HRCvFUyR] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:30.113 DEBUG [HRCvFUyR] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:30.114 DEBUG [HRCvFUyR] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:30.115 DEBUG [HRCvFUyR] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:30.118 DEBUG [HRCvFUyR] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:30.119 DEBUG [HRCvFUyR] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:30.119 DEBUG [HRCvFUyR] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:30.122 DEBUG [HRCvFUyR] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:30.124 DEBUG [HRCvFUyR] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 16ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"HRCvFUyR", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976650122}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:30.133 DEBUG [PwWdrc6S] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels/1 | IP: 127.0.0.1
15:17:30.135 DEBUG [PwWdrc6S] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:30.135 DEBUG [PwWdrc6S] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:30.138 DEBUG [PwWdrc6S] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:30.141 DEBUG [PwWdrc6S] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:30.141 DEBUG [PwWdrc6S] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:30.144 DEBUG [PwWdrc6S] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:30.145 DEBUG [PwWdrc6S] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels/1 200 12ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels/1
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#getLevel(Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"PwWdrc6S", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},"timestamp":1782976650144}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:30.155 DEBUG [PjSb93SM] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels/999 | IP: 127.0.0.1
15:17:30.157 DEBUG [PjSb93SM] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:30.158 DEBUG [PjSb93SM] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:30.160 DEBUG [PjSb93SM] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:30.163  WARN [PjSb93SM] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=4001, message=用户等级不存在
15:17:30.164 DEBUG [PjSb93SM] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels/999 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels/999
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#getLevel(Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"PjSb93SM", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":4001,"message":"用户等级不存在","data":null,"timestamp":1782976650163}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:30.173 DEBUG [NPB2szSe] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my | IP: 127.0.0.1
15:17:30.175 DEBUG [NPB2szSe] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:30.175 DEBUG [NPB2szSe] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:30.178 DEBUG [NPB2szSe] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:30.179 DEBUG [NPB2szSe] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:30.180 DEBUG [NPB2szSe] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:30.183 DEBUG [NPB2szSe] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:30.186 DEBUG [NPB2szSe] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my 200 13ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/my
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"NPB2szSe", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":1,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976650183}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:30.190 DEBUG [n8kMYTBt] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my | IP: 127.0.0.1
15:17:30.195  WARN [n8kMYTBt] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my 401 5ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/my
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"n8kMYTBt", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976650193}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:30.204 DEBUG [z6SD5Ga9] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/refresh | IP: 127.0.0.1
15:17:30.206 DEBUG [z6SD5Ga9] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:30.206 DEBUG [z6SD5Ga9] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:30.208 DEBUG [z6SD5Ga9] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:30.211  WARN [z6SD5Ga9] [1] [        main] c.xuekairui.user.util.JwtUtil  : JWT解析Token失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4.  Found: 0
15:17:30.214  WARN [z6SD5Ga9] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=1302, message=Token无效
15:17:30.215 DEBUG [z6SD5Ga9] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/refresh 200 11ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/refresh
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw", Content-Length:"37"]
             Body = {"refreshToken":"test_refresh_token"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#refreshToken(RefreshTokenRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"z6SD5Ga9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":1302,"message":"Token无效","data":null,"timestamp":1782976650214}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:30.220 DEBUG [xdkrmsmL] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/refresh | IP: 127.0.0.1
15:17:30.221  WARN [xdkrmsmL] [] [        main] c.x.h.GlobalExceptionHandler   : 请求体解析失败: Required request body is missing: public com.xuekairui.common.Result<com.xuekairui.user.dto.LoginResponse> com.xuekairui.user.controller.AuthController.refreshToken(com.xuekairui.user.dto.RefreshTokenRequest)
15:17:30.222  WARN [xdkrmsmL] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/refresh 400 2ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/refresh
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8"]
             Body = 
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#refreshToken(RefreshTokenRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.http.converter.HttpMessageNotReadableException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"xdkrmsmL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"请求体格式错误","data":null,"timestamp":1782976650221}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 21, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 5.401 s -- in 营业执照和优惠券模块测试
[INFO] Running 优惠券接口测试
15:17:30.228  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.CouponControllerTest]: CouponControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:17:30.232  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.CouponControllerTest
15:17:33.472 DEBUG [6f4j6tKy] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/coupon/issue | IP: 127.0.0.1
15:17:33.473 DEBUG [6f4j6tKy] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:33.473 DEBUG [6f4j6tKy] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:33.474 DEBUG [6f4j6tKy] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:33.479 DEBUG [6f4j6tKy] [1] [        main] c.x.u.m.C.selectById           : ==>  Preparing: SELECT id,name,type,value,total_count,issued_count,valid_type,valid_days,valid_start,valid_end,min_level_code,status,description,create_time,update_time FROM t_coupon WHERE id=?
15:17:33.480 DEBUG [6f4j6tKy] [1] [        main] c.x.u.m.C.selectById           : ==> Parameters: 999(Long)
15:17:33.481 DEBUG [6f4j6tKy] [1] [        main] c.x.u.m.C.selectById           : <==      Total: 0
15:17:33.484  WARN [6f4j6tKy] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=4101, message=优惠券不存在
15:17:33.485 DEBUG [6f4j6tKy] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/coupon/issue 200 14ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/coupon/issue
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA", Content-Length:"44"]
             Body = {
    "couponId": 999,
    "userIds": [1]
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CouponController
           Method = com.xuekairui.user.controller.CouponController#issueCoupon(CouponIssueRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"6f4j6tKy", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":4101,"message":"优惠券不存在","data":null,"timestamp":1782976653484}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:33.488 DEBUG [BKfgqGye] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/coupon/issue | IP: 127.0.0.1
15:17:33.490  WARN [BKfgqGye] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/coupon/issue 401 2ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/coupon/issue
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"28"]
             Body = {"couponId":1,"userIds":[1]}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"BKfgqGye", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976653489}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:33.495 DEBUG [DqqVmsEU] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my | IP: 127.0.0.1
15:17:33.496 DEBUG [DqqVmsEU] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:33.496 DEBUG [DqqVmsEU] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:33.499 DEBUG [DqqVmsEU] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:33.500 DEBUG [DqqVmsEU] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ?) ORDER BY create_time DESC
15:17:33.500 DEBUG [DqqVmsEU] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long)
15:17:33.502 DEBUG [DqqVmsEU] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 0
15:17:33.503 DEBUG [DqqVmsEU] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my 200 8ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CouponController
           Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"DqqVmsEU", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653502}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:33.509 DEBUG [eBYp2AcF] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my?status=0 | IP: 127.0.0.1
15:17:33.510 DEBUG [eBYp2AcF] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:33.510 DEBUG [eBYp2AcF] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:33.512 DEBUG [eBYp2AcF] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:33.513 DEBUG [eBYp2AcF] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
15:17:33.513 DEBUG [eBYp2AcF] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long), 0(Integer)
15:17:33.515 DEBUG [eBYp2AcF] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 0
15:17:33.517 DEBUG [eBYp2AcF] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my?status=0 200 7ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my
       Parameters = {status=[0]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CouponController
           Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"eBYp2AcF", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653516}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:33.524 DEBUG [sZPhJCxp] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my?status=1 | IP: 127.0.0.1
15:17:33.525 DEBUG [sZPhJCxp] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:33.525 DEBUG [sZPhJCxp] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:33.527 DEBUG [sZPhJCxp] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:33.528 DEBUG [sZPhJCxp] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
15:17:33.528 DEBUG [sZPhJCxp] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long), 1(Integer)
15:17:33.530 DEBUG [sZPhJCxp] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 0
15:17:33.531 DEBUG [sZPhJCxp] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my?status=1 200 7ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my
       Parameters = {status=[1]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CouponController
           Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"sZPhJCxp", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653530}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:33.539 DEBUG [ewhLF74V] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my?status=2 | IP: 127.0.0.1
15:17:33.540 DEBUG [ewhLF74V] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:33.540 DEBUG [ewhLF74V] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:33.542 DEBUG [ewhLF74V] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:33.543 DEBUG [ewhLF74V] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
15:17:33.544 DEBUG [ewhLF74V] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long), 2(Integer)
15:17:33.545 DEBUG [ewhLF74V] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 0
15:17:33.547 DEBUG [ewhLF74V] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my?status=2 200 8ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my
       Parameters = {status=[2]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CouponController
           Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ewhLF74V", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653545}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:33.552 DEBUG [eW83GppW] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my | IP: 127.0.0.1
15:17:33.554  WARN [eW83GppW] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"eW83GppW", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976653553}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:33.560 DEBUG [v5KvzYpy] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my/available | IP: 127.0.0.1
15:17:33.561 DEBUG [v5KvzYpy] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:33.561 DEBUG [v5KvzYpy] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:33.563 DEBUG [v5KvzYpy] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:33.565 DEBUG [v5KvzYpy] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ? AND expire_time > ?) ORDER BY expire_time ASC
15:17:33.565 DEBUG [v5KvzYpy] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long), 0(Integer), 2026-07-02T15:17:33.564736800(LocalDateTime)
15:17:33.567 DEBUG [v5KvzYpy] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 0
15:17:33.568 DEBUG [v5KvzYpy] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my/available 200 8ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my/available
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CouponController
           Method = com.xuekairui.user.controller.CouponController#listAvailableCoupons(HttpServletRequest, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"v5KvzYpy", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653567}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:33.574 DEBUG [VUWXXu3N] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my/available?type=CRAWLER | IP: 127.0.0.1
15:17:33.575 DEBUG [VUWXXu3N] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:33.575 DEBUG [VUWXXu3N] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:33.577 DEBUG [VUWXXu3N] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:33.578 DEBUG [VUWXXu3N] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:17:33.578 DEBUG [VUWXXu3N] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:17:33.580 DEBUG [VUWXXu3N] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:33.581 DEBUG [VUWXXu3N] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ? AND expire_time > ?) ORDER BY expire_time ASC
15:17:33.581 DEBUG [VUWXXu3N] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long), 0(Integer), 2026-07-02T15:17:33.578151100(LocalDateTime)
15:17:33.583 DEBUG [VUWXXu3N] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 0
15:17:33.584 DEBUG [VUWXXu3N] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my/available?type=CRAWLER 200 10ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my/available
       Parameters = {type=[CRAWLER]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CouponController
           Method = com.xuekairui.user.controller.CouponController#listAvailableCoupons(HttpServletRequest, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"VUWXXu3N", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653583}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:33.587 DEBUG [yMRXYfgu] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my/available | IP: 127.0.0.1
15:17:33.589  WARN [yMRXYfgu] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my/available 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my/available
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"yMRXYfgu", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976653588}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.366 s -- in 优惠券接口测试
[INFO] Running 爬虫配额接口测试
15:17:33.594  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.CrawlerControllerTest]: CrawlerControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:17:33.596  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.CrawlerControllerTest
15:17:37.278 DEBUG [pbyf9MYW] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:37.279 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.279 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.282 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.283 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.283 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.285 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.285 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:37.285 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:37.288 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:37.289 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:37.289 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:37.291 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:37.291 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:37.291 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:37.293 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:37.293 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:37.293 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:37.295 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:37.295 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:37.295 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:37.297 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:37.298 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:17:37.298 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:17:37.300 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:37.301 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:37.301 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:37.304 DEBUG [pbyf9MYW] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:37.305 DEBUG [pbyf9MYW] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:17:37.305 DEBUG [pbyf9MYW] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
15:17:37.307 DEBUG [pbyf9MYW] [1] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:17:37.311 DEBUG [pbyf9MYW] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 200 33ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"pbyf9MYW", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976657309}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.319 DEBUG [fy5QaPJW] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:37.321 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.321 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.323 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.324 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.324 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.326 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.326 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:37.326 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:37.328 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:37.329 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:37.329 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:37.330 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:37.331 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:37.331 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:37.332 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:37.333 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:37.333 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:37.334 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:37.334 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:37.334 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:37.336 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:37.337 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:17:37.337 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:17:37.339 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:37.339 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:37.340 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:37.341 DEBUG [fy5QaPJW] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:37.342 DEBUG [fy5QaPJW] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:17:37.342 DEBUG [fy5QaPJW] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
15:17:37.344 DEBUG [fy5QaPJW] [1] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:17:37.345 DEBUG [fy5QaPJW] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 200 26ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"fy5QaPJW", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976657345}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.354 DEBUG [9NtTg9pC] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:37.355 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.355 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.357 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.359 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.359 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.361 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.361 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:37.361 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:37.363 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:37.364 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:37.365 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:37.367 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:37.368 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:37.368 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:37.369 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:37.370 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:37.370 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:37.372 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:37.372 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:37.372 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:37.374 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:37.376 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:17:37.376 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:17:37.377 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:37.378 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:37.378 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:37.379 DEBUG [9NtTg9pC] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:37.379 DEBUG [9NtTg9pC] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:17:37.380 DEBUG [9NtTg9pC] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
15:17:37.381 DEBUG [9NtTg9pC] [1] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:17:37.382 DEBUG [9NtTg9pC] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 200 28ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"9NtTg9pC", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976657381}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.391 DEBUG [rJNHGESL] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:37.392 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.392 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.395 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.397 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.397 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.398 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.398 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:37.399 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:37.401 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:37.401 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:37.402 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:37.404 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:37.404 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:37.404 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:37.407 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:37.407 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:37.407 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:37.409 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:37.409 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:37.409 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:37.411 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:37.412 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:17:37.412 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:17:37.414 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:37.414 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:37.415 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:37.416 DEBUG [rJNHGESL] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:37.417 DEBUG [rJNHGESL] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:17:37.417 DEBUG [rJNHGESL] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
15:17:37.418 DEBUG [rJNHGESL] [1] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:17:37.419 DEBUG [rJNHGESL] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 200 28ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"rJNHGESL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976657418}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.426 DEBUG [GB9mtVWR] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:37.427  WARN [GB9mtVWR] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"GB9mtVWR", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976657427}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.435 DEBUG [BPJBcVxV] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:37.436 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.437 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.439 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.440 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.441 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.443 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.443 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:37.443 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:37.445 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:37.446 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:37.446 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:37.449 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:37.449 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:37.449 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:37.451 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:37.451 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:37.451 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:37.454 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:37.454 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:37.454 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:37.455 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:37.456 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:17:37.456 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:17:37.458 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:37.458 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:37.458 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:37.460 DEBUG [BPJBcVxV] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:37.460 DEBUG [BPJBcVxV] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:17:37.460 DEBUG [BPJBcVxV] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
15:17:37.462 DEBUG [BPJBcVxV] [1] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:17:37.463 DEBUG [BPJBcVxV] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 200 28ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"BPJBcVxV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976657463}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.473 DEBUG [AMuzzZpH] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:37.475 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.475 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.477 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.483 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.484 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.486 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.486 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:37.487 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:37.488 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:37.489 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:37.490 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:37.493 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:37.493 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:37.493 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:37.495 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:37.496 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:37.496 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:37.498 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:37.499 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:37.499 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:37.501 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:37.501 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:37.501 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:37.504 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:37.504 DEBUG [AMuzzZpH] [1] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:37.504 DEBUG [AMuzzZpH] [1] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
15:17:37.507 DEBUG [AMuzzZpH] [1] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:37.507 DEBUG [AMuzzZpH] [1] [        main] c.x.u.service.CrawlerService   : 用户1消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:37.508 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:37.509 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580436893048834(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:37.508689200(LocalDateTime)
15:17:37.513 DEBUG [AMuzzZpH] [1] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:37.519 DEBUG [AMuzzZpH] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 46ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"34"]
             Body = {"count":1,"useCouponFirst":false}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"AMuzzZpH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657518}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.531 DEBUG [PhuWA6H2] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:37.532 DEBUG [PhuWA6H2] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.532 DEBUG [PhuWA6H2] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.535 DEBUG [PhuWA6H2] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.537  WARN [PhuWA6H2] [1] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 消耗次数至少为1
15:17:37.538  WARN [PhuWA6H2] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 400 7ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"11"]
             Body = {"count":0}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"PhuWA6H2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"消耗次数至少为1","data":null,"timestamp":1782976657537}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.546 DEBUG [us6NqvZa] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:37.547 DEBUG [us6NqvZa] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.547 DEBUG [us6NqvZa] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.549 DEBUG [us6NqvZa] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.550  WARN [us6NqvZa] [1] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 消耗次数至少为1
15:17:37.552  WARN [us6NqvZa] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 400 6ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"12"]
             Body = {"count":-1}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"us6NqvZa", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"消耗次数至少为1","data":null,"timestamp":1782976657550}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.557 DEBUG [NDzsean2] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:37.563  WARN [NDzsean2] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 401 6ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"11"]
             Body = {"count":1}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"NDzsean2", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976657562}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.571 DEBUG [Ne3wWgjd] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:37.572 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.572 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.574 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.576 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.577 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.579 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.579 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:37.579 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:37.581 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:37.582 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:37.582 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:37.583 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:37.584 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:37.584 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:37.585 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:37.586 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:37.586 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:37.587 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:37.587 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:37.587 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:37.588 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:37.588 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:37.588 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:37.589 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:37.589 DEBUG [Ne3wWgjd] [1] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:37.590 DEBUG [Ne3wWgjd] [1] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
15:17:37.591 DEBUG [Ne3wWgjd] [1] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:37.591 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.service.CrawlerService   : 用户1消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:37.591 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:37.592 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580437270536194(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:37.591815(LocalDateTime)
15:17:37.593 DEBUG [Ne3wWgjd] [1] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:37.598 DEBUG [Ne3wWgjd] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 27ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"2"]
             Body = {}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Ne3wWgjd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657597}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.608 DEBUG [MZTyaA9e] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:37.609 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.609 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.612 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.614 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.614 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.616 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.616 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:37.616 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:37.618 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:37.619 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:37.619 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:37.621 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:37.621 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:37.621 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:37.622 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:37.623 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:37.623 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:37.624 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:37.625 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:37.625 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:37.627 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:37.627 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:37.627 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:37.628 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:37.629 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ? AND status = ?)
15:17:37.630 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String), 1(Integer)
15:17:37.631 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:37.633 DEBUG [MZTyaA9e] [1] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:37.633 DEBUG [MZTyaA9e] [1] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
15:17:37.634 DEBUG [MZTyaA9e] [1] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:37.634 DEBUG [MZTyaA9e] [1] [        main] c.x.u.service.CrawlerService   : 用户1消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:37.635 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:37.635 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580437463474178(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:37.634586500(LocalDateTime)
15:17:37.637 DEBUG [MZTyaA9e] [1] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:37.642 DEBUG [MZTyaA9e] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 34ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"33"]
             Body = {"count":1,"useCouponFirst":true}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"MZTyaA9e", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657641}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.651 DEBUG [ptNcnr3X] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:37.652 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.652 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.655 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.657 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.657 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:37.658 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.659 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:37.659 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:37.661 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:37.662 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:37.662 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:37.665 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:37.665 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:37.665 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:37.667 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:37.668 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:37.668 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:37.670 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:37.670 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:37.670 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:37.672 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:37.673 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:37.673 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:37.675 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:37.676 DEBUG [ptNcnr3X] [1] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:37.677 DEBUG [ptNcnr3X] [1] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
15:17:37.680 DEBUG [ptNcnr3X] [1] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:37.680 DEBUG [ptNcnr3X] [1] [        main] c.x.u.service.CrawlerService   : 用户1消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:37.681 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
15:17:37.682 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580437656412161(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), taobao(String), QUOTA(String), 2026-07-02T15:17:37.680703800(LocalDateTime)
15:17:37.686 DEBUG [ptNcnr3X] [1] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:37.692 DEBUG [ptNcnr3X] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 41ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"31"]
             Body = {"count":1,"platform":"taobao"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ptNcnr3X", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657691}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.705 DEBUG [UrHsWQcj] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:37.707 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.708 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:37.711 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.715 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.715 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:37.717 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.717 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:37.718 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
15:17:37.720 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:37.721 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:37.721 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:37.723 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:37.724 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:37.724 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 2(Long)
15:17:37.727 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:37.727 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:37.727 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 2(Long)
15:17:37.729 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:37.730 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:37.730 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 2(Long)
15:17:37.732 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:37.732 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:37.732 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 2(Long)
15:17:37.735 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:37.735 DEBUG [UrHsWQcj] [2] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:37.736 DEBUG [UrHsWQcj] [2] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
15:17:37.738 DEBUG [UrHsWQcj] [2] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:37.738 DEBUG [UrHsWQcj] [2] [        main] c.x.u.service.CrawlerService   : 用户2消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:37.739 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
15:17:37.739 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580437912264705(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), jd(String), QUOTA(String), 2026-07-02T15:17:37.739087600(LocalDateTime)
15:17:37.743 DEBUG [UrHsWQcj] [2] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:37.751 DEBUG [UrHsWQcj] [2] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 46ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"27"]
             Body = {"count":1,"platform":"jd"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"UrHsWQcj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657750}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.753 DEBUG [qDYxGqKY] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:37.758 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.758 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:37.761 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.761 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:37.761 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
15:17:37.764 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:37.765 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:37.766 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:37.768 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:37.769 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:37.769 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 2(Long)
15:17:37.772 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:37.772 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:37.772 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 2(Long)
15:17:37.774 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:37.775 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:37.775 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 2(Long)
15:17:37.778 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:37.778 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:37.778 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 2(Long)
15:17:37.781 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:37.782 DEBUG [qDYxGqKY] [2] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:37.782 DEBUG [qDYxGqKY] [2] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
15:17:37.785 DEBUG [qDYxGqKY] [2] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:37.785 DEBUG [qDYxGqKY] [2] [        main] c.x.u.service.CrawlerService   : 用户2消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:37.787 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
15:17:37.787 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580438105202690(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), pdd(String), QUOTA(String), 2026-07-02T15:17:37.787346800(LocalDateTime)
15:17:37.792 DEBUG [qDYxGqKY] [2] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:37.799 DEBUG [qDYxGqKY] [2] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 46ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"28"]
             Body = {"count":1,"platform":"pdd"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"qDYxGqKY", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657799}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.800 DEBUG [BqTC8wBs] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:37.806 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.806 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:37.809 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.809 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:37.810 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
15:17:37.812 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:37.813 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:37.813 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:37.816 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:37.816 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:37.816 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 2(Long)
15:17:37.818 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:37.818 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:37.819 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 2(Long)
15:17:37.821 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:37.821 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:37.821 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 2(Long)
15:17:37.823 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:37.824 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:37.824 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 2(Long)
15:17:37.826 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:37.827 DEBUG [BqTC8wBs] [2] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:37.827 DEBUG [BqTC8wBs] [2] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
15:17:37.829 DEBUG [BqTC8wBs] [2] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:37.829 DEBUG [BqTC8wBs] [2] [        main] c.x.u.service.CrawlerService   : 用户2消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:37.830 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
15:17:37.830 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580438298140673(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), douyin(String), QUOTA(String), 2026-07-02T15:17:37.830262700(LocalDateTime)
15:17:37.834 DEBUG [BqTC8wBs] [2] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:37.842 DEBUG [BqTC8wBs] [2] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 42ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"31"]
             Body = {"count":1,"platform":"douyin"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"BqTC8wBs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657841}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.843 DEBUG [uYEhnXpk] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:37.850 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.850 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:37.852 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.853 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:37.853 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
15:17:37.857 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:37.858 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:37.858 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:37.862 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:37.862 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:37.862 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 2(Long)
15:17:37.865 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:37.865 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:37.865 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 2(Long)
15:17:37.868 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:37.868 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:37.868 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 2(Long)
15:17:37.871 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:37.871 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:37.871 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 2(Long)
15:17:37.874 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:37.875 DEBUG [uYEhnXpk] [2] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:37.875 DEBUG [uYEhnXpk] [2] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
15:17:37.877 DEBUG [uYEhnXpk] [2] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:37.877 DEBUG [uYEhnXpk] [2] [        main] c.x.u.service.CrawlerService   : 用户2消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:37.879 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
15:17:37.879 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580438491078658(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), kuaishou(String), QUOTA(String), 2026-07-02T15:17:37.879254500(LocalDateTime)
15:17:37.884 DEBUG [uYEhnXpk] [2] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:37.892 DEBUG [uYEhnXpk] [2] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 49ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"33"]
             Body = {"count":1,"platform":"kuaishou"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"uYEhnXpk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657891}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.893 DEBUG [GM4JKDZK] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:37.898 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.898 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:37.901 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.901 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:37.901 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
15:17:37.903 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:37.904 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:37.904 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:37.906 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:37.907 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:37.907 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 2(Long)
15:17:37.909 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:37.909 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:37.910 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 2(Long)
15:17:37.911 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:37.912 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:37.912 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 2(Long)
15:17:37.913 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:37.913 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:37.914 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 2(Long)
15:17:37.915 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:37.916 DEBUG [GM4JKDZK] [2] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:37.916 DEBUG [GM4JKDZK] [2] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
15:17:37.918 DEBUG [GM4JKDZK] [2] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:37.918 DEBUG [GM4JKDZK] [2] [        main] c.x.u.service.CrawlerService   : 用户2消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:37.919 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
15:17:37.919 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580438621102081(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), xiaohongshu(String), QUOTA(String), 2026-07-02T15:17:37.919152800(LocalDateTime)
15:17:37.923 DEBUG [GM4JKDZK] [2] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:37.930 DEBUG [GM4JKDZK] [2] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 37ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"36"]
             Body = {"count":1,"platform":"xiaohongshu"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"GM4JKDZK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657929}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.931 DEBUG [LDKCYCS2] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:37.936 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.936 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:37.940 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.940 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:37.940 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
15:17:37.944 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:37.945 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:37.946 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:37.949 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:37.950 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:37.950 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 2(Long)
15:17:37.952 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:37.952 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:37.953 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 2(Long)
15:17:37.956 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:37.957 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:37.957 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 2(Long)
15:17:37.960 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:37.960 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:37.960 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 2(Long)
15:17:37.962 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:37.963 DEBUG [LDKCYCS2] [2] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:37.963 DEBUG [LDKCYCS2] [2] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
15:17:37.965 DEBUG [LDKCYCS2] [2] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:37.966 DEBUG [LDKCYCS2] [2] [        main] c.x.u.service.CrawlerService   : 用户2消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:37.966 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
15:17:37.967 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580438814040065(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), vipshop(String), QUOTA(String), 2026-07-02T15:17:37.966757900(LocalDateTime)
15:17:37.972 DEBUG [LDKCYCS2] [2] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:37.979 DEBUG [LDKCYCS2] [2] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 48ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"32"]
             Body = {"count":1,"platform":"vipshop"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"LDKCYCS2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657978}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:37.980 DEBUG [ckc3HMJk] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:37.984 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:37.984 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:37.986 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:37.987 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:37.987 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
15:17:37.990 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:37.991 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:37.991 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:37.994 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:37.995 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:37.995 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 2(Long)
15:17:37.997 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:37.997 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:37.997 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 2(Long)
15:17:37.998 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:37.999 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:37.999 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 2(Long)
15:17:38.000 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:38.000 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:38.000 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 2(Long)
15:17:38.003 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:38.004 DEBUG [ckc3HMJk] [2] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:38.004 DEBUG [ckc3HMJk] [2] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
15:17:38.006 DEBUG [ckc3HMJk] [2] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:38.007 DEBUG [ckc3HMJk] [2] [        main] c.x.u.service.CrawlerService   : 用户2消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:38.007 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
15:17:38.007 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580439006978050(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), other(String), QUOTA(String), 2026-07-02T15:17:38.007018400(LocalDateTime)
15:17:38.010 DEBUG [ckc3HMJk] [2] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:38.016 DEBUG [ckc3HMJk] [2] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 36ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"30"]
             Body = {"count":1,"platform":"other"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ckc3HMJk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976658016}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:38.025 DEBUG [bZx3SFPK] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:38.026 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:38.026 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:38.028 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:38.032 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:38.032 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:38.034 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:38.034 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:38.034 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:38.035 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:38.036 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:38.036 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:38.038 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:38.039 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:38.039 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:38.040 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:38.040 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:38.040 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:38.042 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:38.042 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:38.042 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:38.043 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:38.043 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:38.043 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:38.045 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:38.045 DEBUG [bZx3SFPK] [1] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:38.046 DEBUG [bZx3SFPK] [1] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
15:17:38.047 DEBUG [bZx3SFPK] [1] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:38.047 DEBUG [bZx3SFPK] [1] [        main] c.x.u.service.CrawlerService   : 用户1消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:38.048 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:38.048 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580439204110337(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:38.048246300(LocalDateTime)
15:17:38.050 DEBUG [bZx3SFPK] [1] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:38.055 DEBUG [bZx3SFPK] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 30ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.jLJIVaGoMIAh3uvqMmL6lgC8gmzM5V1r2yp8HWM30HfXfOD9qf1b4HXa3Angk637ted8Ig8kkTSqaBOHFVPpRg", Content-Length:"11"]
             Body = {"count":1}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"bZx3SFPK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976658054}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:38.065 DEBUG [Y4CBSrDX] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs | IP: 127.0.0.1
15:17:38.067 DEBUG [Y4CBSrDX] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:38.067 DEBUG [Y4CBSrDX] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:38.068 DEBUG [Y4CBSrDX] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:38.070 DEBUG [Y4CBSrDX] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
15:17:38.071 DEBUG [Y4CBSrDX] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: 1(Long), 2026-06-25(LocalDate)
15:17:38.072 DEBUG [Y4CBSrDX] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:38.074 DEBUG [Y4CBSrDX] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/logs
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.jLJIVaGoMIAh3uvqMmL6lgC8gmzM5V1r2yp8HWM30HfXfOD9qf1b4HXa3Angk637ted8Ig8kkTSqaBOHFVPpRg"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Y4CBSrDX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976658072}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:38.081 DEBUG [hJkB9JbB] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs?days=30 | IP: 127.0.0.1
15:17:38.082 DEBUG [hJkB9JbB] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:38.082 DEBUG [hJkB9JbB] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:38.084 DEBUG [hJkB9JbB] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:38.085 DEBUG [hJkB9JbB] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
15:17:38.085 DEBUG [hJkB9JbB] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: 1(Long), 2026-06-02(LocalDate)
15:17:38.087 DEBUG [hJkB9JbB] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:38.088 DEBUG [hJkB9JbB] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs?days=30 200 7ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/logs
       Parameters = {days=[30]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.jLJIVaGoMIAh3uvqMmL6lgC8gmzM5V1r2yp8HWM30HfXfOD9qf1b4HXa3Angk637ted8Ig8kkTSqaBOHFVPpRg"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"hJkB9JbB", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976658087}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:38.094 DEBUG [jYTHp9My] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs | IP: 127.0.0.1
15:17:38.096  WARN [jYTHp9My] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/logs
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"jYTHp9My", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976658095}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:38.103 DEBUG [5TTJHDrj] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:38.104 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:38.104 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:38.106 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:38.110 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:38.110 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:38.112 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:38.112 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:38.112 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:38.114 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:38.115 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:38.115 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:38.117 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:38.117 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:38.117 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:38.119 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:38.119 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:38.119 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:38.121 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:38.121 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:38.121 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:38.122 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:38.123 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:38.123 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:38.124 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:38.125 DEBUG [5TTJHDrj] [1] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:38.125 DEBUG [5TTJHDrj] [1] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
15:17:38.127 DEBUG [5TTJHDrj] [1] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:38.127 DEBUG [5TTJHDrj] [1] [        main] c.x.u.service.CrawlerService   : 用户1消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:38.127 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
15:17:38.127 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580439522877441(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), taobao(String), QUOTA(String), 2026-07-02T15:17:38.127626300(LocalDateTime)
15:17:38.129 DEBUG [5TTJHDrj] [1] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:38.135 DEBUG [5TTJHDrj] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 32ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.jLJIVaGoMIAh3uvqMmL6lgC8gmzM5V1r2yp8HWM30HfXfOD9qf1b4HXa3Angk637ted8Ig8kkTSqaBOHFVPpRg", Content-Length:"31"]
             Body = {"count":1,"platform":"taobao"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"5TTJHDrj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976658134}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:38.136 DEBUG [pKRrx5sp] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs?days=7 | IP: 127.0.0.1
15:17:38.138 DEBUG [pKRrx5sp] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
15:17:38.138 DEBUG [pKRrx5sp] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: 1(Long), 2026-06-25(LocalDate)
15:17:38.140 DEBUG [pKRrx5sp] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 1
15:17:38.141 DEBUG [pKRrx5sp] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs?days=7 200 5ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/logs
       Parameters = {days=[7]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.jLJIVaGoMIAh3uvqMmL6lgC8gmzM5V1r2yp8HWM30HfXfOD9qf1b4HXa3Angk637ted8Ig8kkTSqaBOHFVPpRg"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"pKRrx5sp", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":2072580439522877441,"userId":1,"usageDate":"2026-07-02","usageCount":1,"platform":"taobao","source":"QUOTA","remark":null,"createTime":"2026-07-02 15:17:38"}],"timestamp":1782976658140}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:38.155 DEBUG [PvaXdNKZ] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:38.157 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:38.157 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9001(Long)
15:17:38.158 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:38.161 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:38.161 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9001(Long)
15:17:38.162 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:38.162 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:38.162 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9001(Long)
15:17:38.164 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:38.164 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:38.164 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:38.165 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:38.166 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:38.166 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9001(Long)
15:17:38.167 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:38.167 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:38.167 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9001(Long)
15:17:38.168 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:38.169 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:38.169 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9001(Long)
15:17:38.170 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:38.171 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:38.171 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9001(Long)
15:17:38.172 DEBUG [PvaXdNKZ] [9001] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:38.174  WARN [PvaXdNKZ] [9001] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=4201, message=今日爬虫次数已用完
15:17:38.174 DEBUG [PvaXdNKZ] [9001] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 19ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkwMDEsInN1YiI6IjkwMDEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.RB29YiTzsukc7u3p6K3KYrpeGSLaBGCCE2OS3_cCF4mynL4v6lJwxuL3WIzICLX_AwKUMOpSjuhhAA64jLAbRw", Content-Length:"12"]
             Body = {"count":15}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"PvaXdNKZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":4201,"message":"今日爬虫次数已用完","data":null,"timestamp":1782976658174}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:38.187 DEBUG [K6qaJBu7] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:38.188 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:38.188 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9002(Long)
15:17:38.190 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:38.193 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:38.194 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9002(Long)
15:17:38.196 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:38.196 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:38.197 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9002(Long)
15:17:38.199 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:38.199 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:38.200 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:38.201 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:38.202 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:38.202 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9002(Long)
15:17:38.203 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:38.203 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:38.203 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9002(Long)
15:17:38.205 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:38.205 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:38.205 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9002(Long)
15:17:38.207 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:38.207 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:38.207 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9002(Long)
15:17:38.208 DEBUG [K6qaJBu7] [9002] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:38.211  WARN [K6qaJBu7] [9002] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=4201, message=今日爬虫次数已用完
15:17:38.212 DEBUG [K6qaJBu7] [9002] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 25ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkwMDIsInN1YiI6IjkwMDIiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.MZfgkeqY-NHNa_-Dm17oQV_5h1WWWvaV6Odh5V_s7tkrkDOF5HgAW2PfOocl_cyTGaqZxpCN0j8D4weLT6HnVg", Content-Length:"12"]
             Body = {"count":11}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"K6qaJBu7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":4201,"message":"今日爬虫次数已用完","data":null,"timestamp":1782976658211}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:38.225 DEBUG [E3WwyApV] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:38.226 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:38.226 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9003(Long)
15:17:38.228 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:38.232 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:38.232 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9003(Long)
15:17:38.234 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:38.235 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:38.235 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9003(Long)
15:17:38.237 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:38.238 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:38.238 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:38.240 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:38.240 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:38.240 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9003(Long)
15:17:38.242 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:38.242 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:38.242 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9003(Long)
15:17:38.244 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:38.244 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:38.244 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9003(Long)
15:17:38.247 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:38.247 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:38.248 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9003(Long)
15:17:38.249 DEBUG [E3WwyApV] [9003] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:38.252  WARN [E3WwyApV] [9003] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=4202, message=本月爬虫次数已用完
15:17:38.253 DEBUG [E3WwyApV] [9003] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 28ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkwMDMsInN1YiI6IjkwMDMiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.BLBcyOEglg0g6wIx3VBOs5DUTTjUYiVj2-Bp_QYWfzxgwOwMql8YQmYGocjAXmqj5p-7mO1hSDprXBQzzGWqqw", Content-Length:"13"]
             Body = {"count":999}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"E3WwyApV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":4202,"message":"本月爬虫次数已用完","data":null,"timestamp":1782976658252}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:38.267 DEBUG [uK4Q4k9w] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:38.268 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:38.268 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9101(Long)
15:17:38.269 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:38.270 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:38.270 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9101(Long)
15:17:38.272 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:38.272 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:38.272 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9101(Long)
15:17:38.275 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:38.276 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:38.276 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:38.278 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:38.279 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:38.279 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9101(Long)
15:17:38.280 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:38.280 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:38.281 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9101(Long)
15:17:38.282 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:38.283 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:38.283 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9101(Long)
15:17:38.285 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:38.285 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:17:38.286 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:17:38.287 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:38.287 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:38.287 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9101(Long)
15:17:38.289 DEBUG [uK4Q4k9w] [9101] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:38.289 DEBUG [uK4Q4k9w] [9101] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:17:38.290 DEBUG [uK4Q4k9w] [9101] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 9101(Long)
15:17:38.292 DEBUG [uK4Q4k9w] [9101] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:17:38.294 DEBUG [uK4Q4k9w] [9101] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 200 27ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDEsInN1YiI6IjkxMDEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.CkNHAC302tbQ7C23v5zHRHQqVmdTPQd6pP-1ewgVvHKYlba8s602M2dL-DjDFme2sK-fe_Og0yJxQFdX289ZoA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"uK4Q4k9w", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976658292}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:38.295 DEBUG [5Ne4KJvk] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:38.297 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:38.297 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9101(Long)
15:17:38.299 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:38.299 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:38.300 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9101(Long)
15:17:38.301 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:38.302 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:38.302 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:38.303 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:38.304 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:38.304 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9101(Long)
15:17:38.306 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:38.306 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:38.306 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9101(Long)
15:17:38.308 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:38.308 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:38.308 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9101(Long)
15:17:38.309 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:38.310 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:38.310 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9101(Long)
15:17:38.311 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:38.312 DEBUG [5Ne4KJvk] [9101] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:38.312 DEBUG [5Ne4KJvk] [9101] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9101(Long)
15:17:38.313 DEBUG [5Ne4KJvk] [9101] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:38.313 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.service.CrawlerService   : 用户9101消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:38.314 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:38.314 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580440294629377(Long), 9101(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:38.314155200(LocalDateTime)
15:17:38.317 DEBUG [5Ne4KJvk] [9101] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:38.323 DEBUG [5Ne4KJvk] [9101] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 28ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDEsInN1YiI6IjkxMDEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.CkNHAC302tbQ7C23v5zHRHQqVmdTPQd6pP-1ewgVvHKYlba8s602M2dL-DjDFme2sK-fe_Og0yJxQFdX289ZoA", Content-Length:"11"]
             Body = {"count":1}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"5Ne4KJvk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976658322}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:38.323 DEBUG [SbV9ngzA] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:38.324 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:38.324 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9101(Long)
15:17:38.327 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:38.327 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:38.327 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9101(Long)
15:17:38.329 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:38.330 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:38.330 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:38.332 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:38.332 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:38.332 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9101(Long)
15:17:38.334 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:38.334 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:38.334 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9101(Long)
15:17:38.336 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:38.336 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:38.337 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9101(Long)
15:17:38.338 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:38.339 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:17:38.339 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:17:38.340 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:38.341 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:38.341 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9101(Long)
15:17:38.342 DEBUG [SbV9ngzA] [9101] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:38.343 DEBUG [SbV9ngzA] [9101] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:17:38.343 DEBUG [SbV9ngzA] [9101] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 9101(Long)
15:17:38.344 DEBUG [SbV9ngzA] [9101] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:17:38.345 DEBUG [SbV9ngzA] [9101] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 200 22ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDEsInN1YiI6IjkxMDEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.CkNHAC302tbQ7C23v5zHRHQqVmdTPQd6pP-1ewgVvHKYlba8s602M2dL-DjDFme2sK-fe_Og0yJxQFdX289ZoA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"SbV9ngzA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":1,"todayQuota":10,"todayRemaining":9,"monthUsed":1,"monthQuota":300,"monthRemaining":299,"yearUsed":1,"yearQuota":3650,"yearRemaining":3649,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976658344}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 23, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.754 s -- in 爬虫配额接口测试
[INFO] Running 爬虫配额和平台账号绑定测试
15:17:38.350  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.CrawlerQuotaAndPlatformTest]: CrawlerQuotaAndPlatformTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:17:38.352  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.CrawlerQuotaAndPlatformTest
15:17:41.570 DEBUG [xWGWjQ4R] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:41.571 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.571 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.572 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.573 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.573 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.574 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.574 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:41.575 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:41.576 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:41.577 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:41.577 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:41.578 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:41.578 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:41.578 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:41.580 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:41.580 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:41.580 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:41.581 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:41.581 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:41.581 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:41.582 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:41.583 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:17:41.583 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:17:41.585 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:41.585 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:41.585 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:41.587 DEBUG [xWGWjQ4R] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:41.587 DEBUG [xWGWjQ4R] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:17:41.587 DEBUG [xWGWjQ4R] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
15:17:41.588 DEBUG [xWGWjQ4R] [1] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:17:41.589 DEBUG [xWGWjQ4R] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 200 19ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"xWGWjQ4R", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976661588}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.596 DEBUG [kMjKA3cY] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:41.597 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.597 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.599 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.599 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.599 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.601 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.601 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:41.601 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:41.602 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:41.603 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:41.603 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:41.604 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:41.605 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:41.605 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:41.605 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:41.605 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:41.606 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:41.608 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:41.608 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:41.608 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:41.609 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:41.610 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:17:41.610 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:17:41.611 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:41.611 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:41.611 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:41.612 DEBUG [kMjKA3cY] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:41.612 DEBUG [kMjKA3cY] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:17:41.612 DEBUG [kMjKA3cY] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
15:17:41.614 DEBUG [kMjKA3cY] [1] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:17:41.615 DEBUG [kMjKA3cY] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 200 19ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"kMjKA3cY", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976661615}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.622 DEBUG [v4mAdBGD] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:41.623 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.624 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.625 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.626 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.626 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.628 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.628 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:41.628 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:41.629 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:41.630 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:41.630 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:41.633 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:41.633 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:41.633 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:41.634 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:41.634 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:41.634 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:41.635 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:41.636 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:41.636 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:41.637 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:41.637 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:17:41.637 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:17:41.639 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:41.639 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:41.639 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:41.641 DEBUG [v4mAdBGD] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:41.641 DEBUG [v4mAdBGD] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:17:41.641 DEBUG [v4mAdBGD] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
15:17:41.642 DEBUG [v4mAdBGD] [1] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:17:41.643 DEBUG [v4mAdBGD] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 200 21ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"v4mAdBGD", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976661642}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.649 DEBUG [ApJVwb7L] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:41.650  WARN [ApJVwb7L] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"ApJVwb7L", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976661650}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.657 DEBUG [CXeT6Cg7] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:41.658 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.658 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.660 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.663 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.664 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.665 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.665 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:41.665 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:41.666 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:41.667 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:41.667 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:41.669 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:41.670 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:41.670 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:41.671 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:41.671 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:41.671 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:41.672 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:41.672 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:41.672 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:41.674 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:41.674 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:41.674 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:41.676 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:41.676 DEBUG [CXeT6Cg7] [1] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:41.676 DEBUG [CXeT6Cg7] [1] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
15:17:41.678 DEBUG [CXeT6Cg7] [1] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:41.678 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.service.CrawlerService   : 用户1消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:41.678 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
15:17:41.679 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580454421045249(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), yaoshibang(String), QUOTA(String), 2026-07-02T15:17:41.678146700(LocalDateTime)
15:17:41.682 DEBUG [CXeT6Cg7] [1] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:41.687 DEBUG [CXeT6Cg7] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 30ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"78"]
             Body = {
    "count": 1,
    "useCouponFirst": false,
    "platform": "yaoshibang"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"CXeT6Cg7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976661686}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.698 DEBUG [wJVGpdFN] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:41.699 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.699 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.701 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.703 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.704 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.705 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.705 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:41.705 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:41.706 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:41.707 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:41.707 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:41.709 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:41.709 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:41.709 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:41.710 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:41.711 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:41.711 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:41.711 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:41.712 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:41.712 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:41.712 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:41.712 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:41.712 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:41.713 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:41.714 DEBUG [wJVGpdFN] [1] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:41.714 DEBUG [wJVGpdFN] [1] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
15:17:41.715 DEBUG [wJVGpdFN] [1] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:41.715 DEBUG [wJVGpdFN] [1] [        main] c.x.u.service.CrawlerService   : 用户1消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:41.715 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
15:17:41.715 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580454551068674(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), yaoshibang(String), QUOTA(String), 2026-07-02T15:17:41.715406400(LocalDateTime)
15:17:41.718 DEBUG [wJVGpdFN] [1] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:41.722 DEBUG [wJVGpdFN] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 24ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"49"]
             Body = {
    "count": 1,
    "platform": "yaoshibang"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"wJVGpdFN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976661721}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.731 DEBUG [7VHsx84F] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:41.732 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.732 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.734 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.737 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.737 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.738 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.738 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:41.738 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:41.739 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:41.740 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:41.740 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:41.742 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:41.742 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:41.742 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:41.743 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:41.743 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:41.743 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:41.744 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:41.744 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:41.744 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:41.745 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:41.746 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:41.746 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:41.746 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:41.746 DEBUG [7VHsx84F] [1] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:41.747 DEBUG [7VHsx84F] [1] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
15:17:41.748 DEBUG [7VHsx84F] [1] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:41.748 DEBUG [7VHsx84F] [1] [        main] c.x.u.service.CrawlerService   : 用户1消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:41.748 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
15:17:41.748 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580454676897793(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), yaobangmang(String), QUOTA(String), 2026-07-02T15:17:41.748111500(LocalDateTime)
15:17:41.750 DEBUG [7VHsx84F] [1] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:41.755 DEBUG [7VHsx84F] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 24ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"50"]
             Body = {
    "count": 1,
    "platform": "yaobangmang"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"7VHsx84F", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976661754}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.765 DEBUG [jzsaRJdf] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:41.765 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.766 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.767 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.770 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.770 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.771 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.771 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:41.772 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:41.773 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:41.774 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:41.774 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:41.776 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:41.776 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:41.776 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:41.777 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:41.778 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:41.778 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:41.779 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:41.779 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:41.779 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:41.780 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:41.780 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:41.780 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:41.782 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:41.782 DEBUG [jzsaRJdf] [1] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:41.782 DEBUG [jzsaRJdf] [1] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
15:17:41.784 DEBUG [jzsaRJdf] [1] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:41.784 DEBUG [jzsaRJdf] [1] [        main] c.x.u.service.CrawlerService   : 用户1消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:41.784 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
15:17:41.784 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580454869835778(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), yiyaocheng(String), QUOTA(String), 2026-07-02T15:17:41.784680700(LocalDateTime)
15:17:41.786 DEBUG [jzsaRJdf] [1] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:41.792 DEBUG [jzsaRJdf] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 27ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"49"]
             Body = {
    "count": 1,
    "platform": "yiyaocheng"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"jzsaRJdf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976661792}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.802 DEBUG [mJxZWtZK] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:41.803 DEBUG [mJxZWtZK] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.803 DEBUG [mJxZWtZK] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.805 DEBUG [mJxZWtZK] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.806  WARN [mJxZWtZK] [1] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 消耗次数至少为1
15:17:41.807  WARN [mJxZWtZK] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 400 5ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"49"]
             Body = {
    "count": 0,
    "platform": "yaoshibang"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"mJxZWtZK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"消耗次数至少为1","data":null,"timestamp":1782976661806}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.812 DEBUG [hza3PFrM] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:41.814  WARN [hza3PFrM] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 401 2ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"11"]
             Body = {"count":1}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"hza3PFrM", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976661813}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.820 DEBUG [whCeG6Y9] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs?days=7 | IP: 127.0.0.1
15:17:41.821 DEBUG [whCeG6Y9] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.821 DEBUG [whCeG6Y9] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.824 DEBUG [whCeG6Y9] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.825 DEBUG [whCeG6Y9] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
15:17:41.825 DEBUG [whCeG6Y9] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: 1(Long), 2026-06-25(LocalDate)
15:17:41.826 DEBUG [whCeG6Y9] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:41.827 DEBUG [whCeG6Y9] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs?days=7 200 7ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/logs
       Parameters = {days=[7]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"whCeG6Y9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976661826}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.835 DEBUG [C38pVPxy] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs?days=7 | IP: 127.0.0.1
15:17:41.836 DEBUG [C38pVPxy] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.836 DEBUG [C38pVPxy] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.837 DEBUG [C38pVPxy] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.838 DEBUG [C38pVPxy] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
15:17:41.839 DEBUG [C38pVPxy] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: 1(Long), 2026-06-25(LocalDate)
15:17:41.840 DEBUG [C38pVPxy] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:41.841 DEBUG [C38pVPxy] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs?days=7 200 6ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/logs
       Parameters = {days=[7]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"C38pVPxy", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976661840}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.848 DEBUG [B7DC5Mkn] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs | IP: 127.0.0.1
15:17:41.849 DEBUG [B7DC5Mkn] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.849 DEBUG [B7DC5Mkn] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.851 DEBUG [B7DC5Mkn] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.852 DEBUG [B7DC5Mkn] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
15:17:41.852 DEBUG [B7DC5Mkn] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: 1(Long), 2026-06-25(LocalDate)
15:17:41.853 DEBUG [B7DC5Mkn] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:41.854 DEBUG [B7DC5Mkn] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs 200 6ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/logs
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"B7DC5Mkn", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976661853}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.862 DEBUG [XSNwMZff] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs?days=30 | IP: 127.0.0.1
15:17:41.863 DEBUG [XSNwMZff] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.863 DEBUG [XSNwMZff] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.865 DEBUG [XSNwMZff] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.866 DEBUG [XSNwMZff] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
15:17:41.866 DEBUG [XSNwMZff] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: 1(Long), 2026-06-02(LocalDate)
15:17:41.867 DEBUG [XSNwMZff] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:41.869 DEBUG [XSNwMZff] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs?days=30 200 7ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/logs
       Parameters = {days=[30]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"XSNwMZff", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976661868}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.873 DEBUG [Ns5BHsSr] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs | IP: 127.0.0.1
15:17:41.874  WARN [Ns5BHsSr] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/logs
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"Ns5BHsSr", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976661873}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.881 DEBUG [rkYdLfpA] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind | IP: 127.0.0.1
15:17:41.881 DEBUG [rkYdLfpA] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.882 DEBUG [rkYdLfpA] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.883 DEBUG [rkYdLfpA] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.889 DEBUG [rkYdLfpA] [1] [        main] .u.m.P.selectByUserAndPlatform : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
15:17:41.889 DEBUG [rkYdLfpA] [1] [        main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
15:17:41.891 DEBUG [rkYdLfpA] [1] [        main] .u.m.P.selectByUserAndPlatform : <==      Total: 0
15:17:41.898 DEBUG [rkYdLfpA] [1] [        main] c.x.u.m.P.insert               : ==>  Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:41.898 DEBUG [rkYdLfpA] [1] [        main] c.x.u.m.P.insert               : ==> Parameters: 2072580455318626305(Long), 1(Long), yaoshibang(String), 药师帮(String), EJZkX5AAmfJJtaiasI9Xv37Ern3lgf3gQVUNDuAmMZnQG4vgkkRb(String), R4BZSz47fOdiaJRZN2XUXBa1k0o+46tq25xashcvpGQkWUykatD8U0I=(String), true(Boolean), PENDING(String), 2026-07-02T15:17:41.898965900(LocalDateTime), 2026-07-02T15:17:41.898965900(LocalDateTime)
15:17:41.901 DEBUG [rkYdLfpA] [1] [        main] c.x.u.m.P.insert               : <==    Updates: 1
15:17:41.901  INFO [rkYdLfpA] [1] [        main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaoshibang
15:17:41.906 DEBUG [rkYdLfpA] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:41.907 DEBUG [rkYdLfpA] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580455385735170(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:41.906193800(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:41.906779600(LocalDateTime)
15:17:41.912 DEBUG [rkYdLfpA] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:41.912 DEBUG [rkYdLfpA] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
15:17:41.912 DEBUG [rkYdLfpA] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind 200 31ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/platform-account/bind
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"133"]
             Body = {
    "platformCode": "yaoshibang",
    "platformName": "药师帮",
    "account": "13800138000",
    "password": "test_password"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"rkYdLfpA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976661912}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.922 DEBUG [SBbx2jjJ] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind | IP: 127.0.0.1
15:17:41.923 DEBUG [SBbx2jjJ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.923 DEBUG [SBbx2jjJ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.924 DEBUG [SBbx2jjJ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.926 DEBUG [SBbx2jjJ] [1] [        main] .u.m.P.selectByUserAndPlatform : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
15:17:41.926 DEBUG [SBbx2jjJ] [1] [        main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaobangmang(String)
15:17:41.927 DEBUG [SBbx2jjJ] [1] [        main] .u.m.P.selectByUserAndPlatform : <==      Total: 0
15:17:41.928 DEBUG [SBbx2jjJ] [1] [        main] c.x.u.m.P.insert               : ==>  Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:41.928 DEBUG [SBbx2jjJ] [1] [        main] c.x.u.m.P.insert               : ==> Parameters: 2072580455452844034(Long), 1(Long), yaobangmang(String), 药帮忙(String), OppMs95lNQP1PdbDk2Bet78/Sz4z2Wt2aUksPH69OSz3zE9bY0e9(String), IJcnI6uHez4/wQZck0aFOzAXvWyrQEi/D3Oxu72pmYZn6SRw7sunGMc=(String), true(Boolean), PENDING(String), 2026-07-02T15:17:41.928397100(LocalDateTime), 2026-07-02T15:17:41.928397100(LocalDateTime)
15:17:41.930 DEBUG [SBbx2jjJ] [1] [        main] c.x.u.m.P.insert               : <==    Updates: 1
15:17:41.930  INFO [SBbx2jjJ] [1] [        main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaobangmang
15:17:41.934 DEBUG [SBbx2jjJ] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:41.935 DEBUG [SBbx2jjJ] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580455515758594(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:41.934846100(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaobangmang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:41.934846100(LocalDateTime)
15:17:41.939 DEBUG [SBbx2jjJ] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:41.940 DEBUG [SBbx2jjJ] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
15:17:41.940 DEBUG [SBbx2jjJ] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind 200 18ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/platform-account/bind
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"134"]
             Body = {
    "platformCode": "yaobangmang",
    "platformName": "药帮忙",
    "account": "13800138000",
    "password": "test_password"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"SBbx2jjJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976661940}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.946 DEBUG [5w4LzHqz] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind | IP: 127.0.0.1
15:17:41.947 DEBUG [5w4LzHqz] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.947 DEBUG [5w4LzHqz] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.948 DEBUG [5w4LzHqz] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.950 DEBUG [5w4LzHqz] [1] [        main] .u.m.P.selectByUserAndPlatform : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
15:17:41.950 DEBUG [5w4LzHqz] [1] [        main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yiyaocheng(String)
15:17:41.951 DEBUG [5w4LzHqz] [1] [        main] .u.m.P.selectByUserAndPlatform : <==      Total: 0
15:17:41.952 DEBUG [5w4LzHqz] [1] [        main] c.x.u.m.P.insert               : ==>  Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:41.952 DEBUG [5w4LzHqz] [1] [        main] c.x.u.m.P.insert               : ==> Parameters: 2072580455582867458(Long), 1(Long), yiyaocheng(String), 1药城(String), Y+gICIjM+z0cx6ZX7Bc5Fn9x7vC/2uzTw1eZen5na870bMi8TDGk(String), XM/Ncnrta96k/RDRE+qZXI+gmkLp0+dNSMAoa5AGTJ27MpGZzP9BWbE=(String), true(Boolean), PENDING(String), 2026-07-02T15:17:41.951875300(LocalDateTime), 2026-07-02T15:17:41.951875300(LocalDateTime)
15:17:41.954 DEBUG [5w4LzHqz] [1] [        main] c.x.u.m.P.insert               : <==    Updates: 1
15:17:41.954  INFO [5w4LzHqz] [1] [        main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yiyaocheng
15:17:41.958 DEBUG [5w4LzHqz] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:41.958 DEBUG [5w4LzHqz] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580455582867459(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:41.958341500(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yiyaocheng(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:41.958341500(LocalDateTime)
15:17:41.963 DEBUG [5w4LzHqz] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:41.963 DEBUG [5w4LzHqz] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
15:17:41.964 DEBUG [5w4LzHqz] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind 200 18ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/platform-account/bind
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"131"]
             Body = {
    "platformCode": "yiyaocheng",
    "platformName": "1药城",
    "account": "13800138000",
    "password": "test_password"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"5w4LzHqz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976661963}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.970 DEBUG [3mqMcSZX] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind | IP: 127.0.0.1
15:17:41.971 DEBUG [3mqMcSZX] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.971 DEBUG [3mqMcSZX] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.972 DEBUG [3mqMcSZX] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.974  WARN [3mqMcSZX] [1] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 平台名称不能为空, 密码不能为空, 账号不能为空
15:17:41.975  WARN [3mqMcSZX] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind 400 5ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/platform-account/bind
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"37"]
             Body = {
    "platformCode": "yaoshibang"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"3mqMcSZX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"平台名称不能为空, 密码不能为空, 账号不能为空","data":null,"timestamp":1782976661974}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.979 DEBUG [4y2QdqYg] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind | IP: 127.0.0.1
15:17:41.980  WARN [4y2QdqYg] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind 401 1ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/platform-account/bind
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
             Body = {}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"4y2QdqYg", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976661980}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:41.987 DEBUG [wsq7CMVA] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-account/list | IP: 127.0.0.1
15:17:41.987 DEBUG [wsq7CMVA] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:41.988 DEBUG [wsq7CMVA] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:41.989 DEBUG [wsq7CMVA] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:41.989 DEBUG [wsq7CMVA] [1] [        main] c.x.u.m.P.selectByUserId       : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
15:17:41.989 DEBUG [wsq7CMVA] [1] [        main] c.x.u.m.P.selectByUserId       : ==> Parameters: 1(Long)
15:17:41.991 DEBUG [wsq7CMVA] [1] [        main] c.x.u.m.P.selectByUserId       : <==      Total: 3
15:17:41.995 DEBUG [wsq7CMVA] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-account/list 200 8ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/platform-account/list
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"wsq7CMVA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":2072580455452844034,"platformCode":"yaobangmang","platformName":"药帮忙","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"},{"id":2072580455318626305,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"},{"id":2072580455582867458,"platformCode":"yiyaocheng","platformName":"1药城","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"}],"timestamp":1782976661993}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:42.002 DEBUG [AUyfXxAk] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-account/list | IP: 127.0.0.1
15:17:42.002 DEBUG [AUyfXxAk] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:42.003 DEBUG [AUyfXxAk] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:42.005 DEBUG [AUyfXxAk] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:42.006 DEBUG [AUyfXxAk] [1] [        main] c.x.u.m.P.selectByUserId       : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
15:17:42.006 DEBUG [AUyfXxAk] [1] [        main] c.x.u.m.P.selectByUserId       : ==> Parameters: 1(Long)
15:17:42.007 DEBUG [AUyfXxAk] [1] [        main] c.x.u.m.P.selectByUserId       : <==      Total: 3
15:17:42.008 DEBUG [AUyfXxAk] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-account/list 200 6ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/platform-account/list
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjIsImV4cCI6MTc4MzA2MzA2Mn0.Bw72fwU6bE7o2rZUH0ZCDv_R1_y2a0wJ0wTRQHb6VKJFzQbrGEw2rOErRmkzxd9XSw-mrzb1kIe5946qJWNBlg"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"AUyfXxAk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":2072580455452844034,"platformCode":"yaobangmang","platformName":"药帮忙","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"},{"id":2072580455318626305,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"},{"id":2072580455582867458,"platformCode":"yiyaocheng","platformName":"1药城","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"}],"timestamp":1782976662008}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:42.014 DEBUG [bxpq79Wr] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-account/list | IP: 127.0.0.1
15:17:42.015  WARN [bxpq79Wr] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-account/list 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/platform-account/list
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"bxpq79Wr", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976662014}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:42.022 DEBUG [4mTKVmfX] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/verify/yaoshibang | IP: 127.0.0.1
15:17:42.023 DEBUG [4mTKVmfX] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:42.023 DEBUG [4mTKVmfX] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:42.024 DEBUG [4mTKVmfX] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:42.027 DEBUG [4mTKVmfX] [1] [        main] .u.m.P.selectByUserAndPlatform : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
15:17:42.027 DEBUG [4mTKVmfX] [1] [        main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
15:17:42.028 DEBUG [4mTKVmfX] [1] [        main] .u.m.P.selectByUserAndPlatform : <==      Total: 1
15:17:42.029  INFO [4mTKVmfX] [1] [        main] c.x.u.s.PlatformAccountService : 模拟验证平台账号: platform=yaoshibang, account=13800138000
15:17:42.030 DEBUG [4mTKVmfX] [1] [        main] c.x.u.m.P.updateById           : ==>  Preparing: UPDATE t_platform_account SET user_id=?, platform_code=?, platform_name=?, account_encrypted=?, password_encrypted=?, enabled=?, last_verify_time=?, verify_status=?, create_time=?, update_time=? WHERE id=?
15:17:42.031 DEBUG [4mTKVmfX] [1] [        main] c.x.u.m.P.updateById           : ==> Parameters: 1(Long), yaoshibang(String), 药师帮(String), EJZkX5AAmfJJtaiasI9Xv37Ern3lgf3gQVUNDuAmMZnQG4vgkkRb(String), R4BZSz47fOdiaJRZN2XUXBa1k0o+46tq25xashcvpGQkWUykatD8U0I=(String), true(Boolean), 2026-07-02T15:17:42.029864400(LocalDateTime), SUCCESS(String), 2026-07-02T15:17:42(LocalDateTime), 2026-07-02T15:17:42.029864400(LocalDateTime), 2072580455318626305(Long)
15:17:42.033 DEBUG [4mTKVmfX] [1] [        main] c.x.u.m.P.updateById           : <==    Updates: 1
15:17:42.038 DEBUG [4mTKVmfX] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:42.038 DEBUG [4mTKVmfX] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580455905828866(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:42.037741300(LocalDateTime), ACCOUNT(String), VERIFY(String), 验证B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:42.037741300(LocalDateTime)
15:17:42.042 DEBUG [4mTKVmfX] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:42.042 DEBUG [4mTKVmfX] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 验证B2B平台账号
15:17:42.043 DEBUG [4mTKVmfX] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/verify/yaoshibang 200 21ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/platform-account/verify/yaoshibang
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjIsImV4cCI6MTc4MzA2MzA2Mn0.Bw72fwU6bE7o2rZUH0ZCDv_R1_y2a0wJ0wTRQHb6VKJFzQbrGEw2rOErRmkzxd9XSw-mrzb1kIe5946qJWNBlg"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#verifyAccount(String, Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"4mTKVmfX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976662042}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:42.048 DEBUG [HJAtsU3Q] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/verify/yaoshibang | IP: 127.0.0.1
15:17:42.049  WARN [HJAtsU3Q] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/verify/yaoshibang 401 1ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/platform-account/verify/yaoshibang
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"HJAtsU3Q", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976662049}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:42.055 DEBUG [pRRQcsRB] [] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/platform-account/unbind/yaoshibang | IP: 127.0.0.1
15:17:42.056 DEBUG [pRRQcsRB] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:42.056 DEBUG [pRRQcsRB] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:42.058 DEBUG [pRRQcsRB] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:42.059 DEBUG [pRRQcsRB] [1] [        main] .u.m.P.selectByUserAndPlatform : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
15:17:42.059 DEBUG [pRRQcsRB] [1] [        main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
15:17:42.061 DEBUG [pRRQcsRB] [1] [        main] .u.m.P.selectByUserAndPlatform : <==      Total: 1
15:17:42.061 DEBUG [pRRQcsRB] [1] [        main] c.x.u.m.P.updateById           : ==>  Preparing: UPDATE t_platform_account SET user_id=?, platform_code=?, platform_name=?, account_encrypted=?, password_encrypted=?, enabled=?, last_verify_time=?, verify_status=?, create_time=?, update_time=? WHERE id=?
15:17:42.062 DEBUG [pRRQcsRB] [1] [        main] c.x.u.m.P.updateById           : ==> Parameters: 1(Long), yaoshibang(String), 药师帮(String), EJZkX5AAmfJJtaiasI9Xv37Ern3lgf3gQVUNDuAmMZnQG4vgkkRb(String), R4BZSz47fOdiaJRZN2XUXBa1k0o+46tq25xashcvpGQkWUykatD8U0I=(String), false(Boolean), 2026-07-02T15:17:42(LocalDateTime), SUCCESS(String), 2026-07-02T15:17:42(LocalDateTime), 2026-07-02T15:17:42.061782300(LocalDateTime), 2072580455318626305(Long)
15:17:42.063 DEBUG [pRRQcsRB] [1] [        main] c.x.u.m.P.updateById           : <==    Updates: 1
15:17:42.063  INFO [pRRQcsRB] [1] [        main] c.x.u.s.PlatformAccountService : 解绑平台账号: userId=1, platform=yaoshibang
15:17:42.068 DEBUG [pRRQcsRB] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:42.068 DEBUG [pRRQcsRB] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580456035852289(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:42.068074100(LocalDateTime), ACCOUNT(String), UNBIND(String), 解绑B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:42.068074100(LocalDateTime)
15:17:42.072 DEBUG [pRRQcsRB] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:42.072 DEBUG [pRRQcsRB] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 解绑B2B平台账号
15:17:42.073 DEBUG [pRRQcsRB] [1] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/platform-account/unbind/yaoshibang 200 18ms

MockHttpServletRequest:
      HTTP Method = DELETE
      Request URI = /api/platform-account/unbind/yaoshibang
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjIsImV4cCI6MTc4MzA2MzA2Mn0.Bw72fwU6bE7o2rZUH0ZCDv_R1_y2a0wJ0wTRQHb6VKJFzQbrGEw2rOErRmkzxd9XSw-mrzb1kIe5946qJWNBlg"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#unbindAccount(String, Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"pRRQcsRB", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976662072}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:42.077 DEBUG [z5CuEmpG] [] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/platform-account/unbind/yaoshibang | IP: 127.0.0.1
15:17:42.079  WARN [z5CuEmpG] [] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/platform-account/unbind/yaoshibang 401 2ms

MockHttpServletRequest:
      HTTP Method = DELETE
      Request URI = /api/platform-account/unbind/yaoshibang
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"z5CuEmpG", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976662078}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:42.083 DEBUG [UryBceVa] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-config/enabled | IP: 127.0.0.1
15:17:42.084 DEBUG [UryBceVa] [] [        main] x.u.m.P.selectEnabledPlatforms : ==>  Preparing: SELECT * FROM t_platform_config WHERE enabled = true ORDER BY priority ASC
15:17:42.084 DEBUG [UryBceVa] [] [        main] x.u.m.P.selectEnabledPlatforms : ==> Parameters: 
15:17:42.085 DEBUG [UryBceVa] [] [        main] x.u.m.P.selectEnabledPlatforms : <==      Total: 3
15:17:42.087 DEBUG [UryBceVa] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-config/enabled 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/platform-config/enabled
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerPlatformConfigController
           Method = com.xuekairui.user.controller.CrawlerPlatformConfigController#getEnabledPlatforms()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"UryBceVa", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"platformCode":"yaoshibang","platformName":"药师帮","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":1,"underMaintenance":false,"maintenanceNotice":null,"description":"国内最大B2B医药批发平台","officialUrl":"https://www.yaoshibang.com","bindingInstructions":"请输入您在药师帮的手机号和密码","sortOrder":1,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null},{"id":2,"platformCode":"yaobangmang","platformName":"药帮忙","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":2,"underMaintenance":false,"maintenanceNotice":null,"description":"专业医药B2B采购平台","officialUrl":"https://www.yaobangmang.com","bindingInstructions":"请输入您在药帮忙的手机号和密码","sortOrder":2,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null},{"id":3,"platformCode":"yiyaocheng","platformName":"1药城","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":3,"underMaintenance":false,"maintenanceNotice":null,"description":"1药网旗下B2B医药平台","officialUrl":"https://www.1yaocheng.com","bindingInstructions":"请输入您在1药城的手机号和密码","sortOrder":3,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null}],"timestamp":1782976662086}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:42.092 DEBUG [XJ5fy9Cq] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-config/enabled | IP: 127.0.0.1
15:17:42.093 DEBUG [XJ5fy9Cq] [] [        main] x.u.m.P.selectEnabledPlatforms : ==>  Preparing: SELECT * FROM t_platform_config WHERE enabled = true ORDER BY priority ASC
15:17:42.093 DEBUG [XJ5fy9Cq] [] [        main] x.u.m.P.selectEnabledPlatforms : ==> Parameters: 
15:17:42.094 DEBUG [XJ5fy9Cq] [] [        main] x.u.m.P.selectEnabledPlatforms : <==      Total: 3
15:17:42.095 DEBUG [XJ5fy9Cq] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-config/enabled 200 3ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/platform-config/enabled
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerPlatformConfigController
           Method = com.xuekairui.user.controller.CrawlerPlatformConfigController#getEnabledPlatforms()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"XJ5fy9Cq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"platformCode":"yaoshibang","platformName":"药师帮","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":1,"underMaintenance":false,"maintenanceNotice":null,"description":"国内最大B2B医药批发平台","officialUrl":"https://www.yaoshibang.com","bindingInstructions":"请输入您在药师帮的手机号和密码","sortOrder":1,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null},{"id":2,"platformCode":"yaobangmang","platformName":"药帮忙","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":2,"underMaintenance":false,"maintenanceNotice":null,"description":"专业医药B2B采购平台","officialUrl":"https://www.yaobangmang.com","bindingInstructions":"请输入您在药帮忙的手机号和密码","sortOrder":2,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null},{"id":3,"platformCode":"yiyaocheng","platformName":"1药城","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":3,"underMaintenance":false,"maintenanceNotice":null,"description":"1药网旗下B2B医药平台","officialUrl":"https://www.1yaocheng.com","bindingInstructions":"请输入您在1药城的手机号和密码","sortOrder":3,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null}],"timestamp":1782976662094}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:42.100 DEBUG [GhMadpW3] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-config/yaoshibang | IP: 127.0.0.1
15:17:42.101 DEBUG [GhMadpW3] [] [        main] c.x.u.m.P.selectByPlatformCode : ==>  Preparing: SELECT * FROM t_platform_config WHERE platform_code = ? LIMIT 1
15:17:42.101 DEBUG [GhMadpW3] [] [        main] c.x.u.m.P.selectByPlatformCode : ==> Parameters: yaoshibang(String)
15:17:42.102 DEBUG [GhMadpW3] [] [        main] c.x.u.m.P.selectByPlatformCode : <==      Total: 1
15:17:42.103 DEBUG [GhMadpW3] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-config/yaoshibang 200 3ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/platform-config/yaoshibang
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerPlatformConfigController
           Method = com.xuekairui.user.controller.CrawlerPlatformConfigController#getPlatformConfig(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"GhMadpW3", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"platformCode":"yaoshibang","platformName":"药师帮","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":1,"underMaintenance":false,"maintenanceNotice":null,"description":"国内最大B2B医药批发平台","officialUrl":"https://www.yaoshibang.com","bindingInstructions":"请输入您在药师帮的手机号和密码","sortOrder":1,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null},"timestamp":1782976662102}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:42.108 DEBUG [nt9xTLes] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-config/nonexistent | IP: 127.0.0.1
15:17:42.109 DEBUG [nt9xTLes] [] [        main] c.x.u.m.P.selectByPlatformCode : ==>  Preparing: SELECT * FROM t_platform_config WHERE platform_code = ? LIMIT 1
15:17:42.109 DEBUG [nt9xTLes] [] [        main] c.x.u.m.P.selectByPlatformCode : ==> Parameters: nonexistent(String)
15:17:42.110 DEBUG [nt9xTLes] [] [        main] c.x.u.m.P.selectByPlatformCode : <==      Total: 0
15:17:42.111  WARN [nt9xTLes] [] [        main] c.x.h.GlobalExceptionHandler   : 响应状态异常: status=404 NOT_FOUND, reason=平台配置不存在
15:17:42.114  WARN [nt9xTLes] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-config/nonexistent 404 6ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/platform-config/nonexistent
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerPlatformConfigController
           Method = com.xuekairui.user.controller.CrawlerPlatformConfigController#getPlatformConfig(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.server.ResponseStatusException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 404
    Error message = null
          Headers = [X-Request-Id:"nt9xTLes", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":404,"message":"平台配置不存在","data":null,"timestamp":1782976662111}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 31, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.767 s -- in 爬虫配额和平台账号绑定测试
[INFO] Running 药品搜索接口测试
15:17:42.118  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.DrugSearchControllerTest]: DrugSearchControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:17:42.119  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.DrugSearchControllerTest
15:17:45.075 DEBUG [vvawT3PN] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.076 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.077 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:45.078 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.083 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.083 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:45.084 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.085 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.085 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
15:17:45.087 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.087 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.087 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.089 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.090 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.090 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 2(Long)
15:17:45.091 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.091 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.091 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 2(Long)
15:17:45.092 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.092 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.092 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 2(Long)
15:17:45.093 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.093 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.093 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 2(Long)
15:17:45.094 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.094 DEBUG [vvawT3PN] [2] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:45.095 DEBUG [vvawT3PN] [2] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
15:17:45.096 DEBUG [vvawT3PN] [2] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:45.096 DEBUG [vvawT3PN] [2] [        main] c.x.u.service.CrawlerService   : 用户2消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:45.096 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:45.096 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580468736204801(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.096876700(LocalDateTime)
15:17:45.098 DEBUG [vvawT3PN] [2] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:45.101  INFO [vvawT3PN] [2] [        main] c.x.u.s.DrugSearchService      : 用户 2 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
15:17:45.108 DEBUG [vvawT3PN] [2] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 33ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.jHGRWwg0j7BCOlimrcsNhyTwJtGKbixZL7nkAiB6KH5lOzLiSoYQxE4h3lXSfgyJNRZzM7bO4aHh1YEA3cEqWQ", Content-Length:"32"]
             Body = {"keyword":"阿莫西林胶囊"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"vvawT3PN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665106}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.122 DEBUG [n6LcGSCf] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.122 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.122 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:45.124 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.126 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.126 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:45.127 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.127 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.127 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
15:17:45.128 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.129 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.129 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.130 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.130 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.131 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 2(Long)
15:17:45.132 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.133 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.133 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 2(Long)
15:17:45.134 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.134 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.134 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 2(Long)
15:17:45.135 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.136 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.136 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 2(Long)
15:17:45.136 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.137 DEBUG [n6LcGSCf] [2] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:45.137 DEBUG [n6LcGSCf] [2] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
15:17:45.138 DEBUG [n6LcGSCf] [2] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:45.138 DEBUG [n6LcGSCf] [2] [        main] c.x.u.service.CrawlerService   : 用户2消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:45.138 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:45.138 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580468929142785(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.138859800(LocalDateTime)
15:17:45.140 DEBUG [n6LcGSCf] [2] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:45.140  INFO [n6LcGSCf] [2] [        main] c.x.u.s.DrugSearchService      : 用户 2 搜索药物: 奥美拉唑肠溶胶囊, 平台: null, 找到 3 条结果
15:17:45.144 DEBUG [n6LcGSCf] [2] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 22ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.jHGRWwg0j7BCOlimrcsNhyTwJtGKbixZL7nkAiB6KH5lOzLiSoYQxE4h3lXSfgyJNRZzM7bO4aHh1YEA3cEqWQ", Content-Length:"38"]
             Body = {"keyword":"奥美拉唑肠溶胶囊"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"n6LcGSCf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"keyword":"奥美拉唑肠溶胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":8.90,"spec":"20mg*14粒/盒","manufacturer":"山东罗欣","expiry":"2027-06","moq":20,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=奥美拉唑肠溶胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":9.50,"spec":"20mg*14粒/盒","manufacturer":"山东罗欣","expiry":"2027-04","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaobangmang.com/search?q=奥美拉唑肠溶胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":8.50,"spec":"20mg*14粒/盒","manufacturer":"悦康药业","expiry":"2027-11","moq":1,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.1yaocheng.com/search?q=奥美拉唑肠溶胶囊&ref=zhijiayun"}],"lowestPrice":8.50,"lowestPricePlatform":"1药城","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665143}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.153 DEBUG [pFwvrnR9] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.154 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.154 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:45.155 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.158 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.158 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:45.159 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.159 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.159 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
15:17:45.161 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.162 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.162 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.163 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.163 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.163 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 2(Long)
15:17:45.165 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.165 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.165 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 2(Long)
15:17:45.166 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.167 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.167 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 2(Long)
15:17:45.168 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.169 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.169 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 2(Long)
15:17:45.170 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.170 DEBUG [pFwvrnR9] [2] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:45.170 DEBUG [pFwvrnR9] [2] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
15:17:45.171 DEBUG [pFwvrnR9] [2] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:45.171 DEBUG [pFwvrnR9] [2] [        main] c.x.u.service.CrawlerService   : 用户2消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:45.171 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:45.171 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580469059166209(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.171767800(LocalDateTime)
15:17:45.174 DEBUG [pFwvrnR9] [2] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:45.174  INFO [pFwvrnR9] [2] [        main] c.x.u.s.DrugSearchService      : 用户 2 搜索药物: 不存在的药品名称XYZ, 平台: null, 找到 0 条结果
15:17:45.178 DEBUG [pFwvrnR9] [2] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 25ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.jHGRWwg0j7BCOlimrcsNhyTwJtGKbixZL7nkAiB6KH5lOzLiSoYQxE4h3lXSfgyJNRZzM7bO4aHh1YEA3cEqWQ", Content-Length:"41"]
             Body = {"keyword":"不存在的药品名称XYZ"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"pFwvrnR9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"keyword":"不存在的药品名称XYZ","prices":[],"lowestPrice":null,"lowestPricePlatform":null,"totalCount":0,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665177}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.188 DEBUG [9UXRAf95] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.188 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.189 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:45.190 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.193 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.193 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:45.195 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.195 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.196 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
15:17:45.197 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.198 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.198 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.199 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.200 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.200 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 2(Long)
15:17:45.202 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.202 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.202 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 2(Long)
15:17:45.203 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.203 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.203 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 2(Long)
15:17:45.204 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.204 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.204 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 2(Long)
15:17:45.205 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.206 DEBUG [9UXRAf95] [2] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:45.206 DEBUG [9UXRAf95] [2] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
15:17:45.207 DEBUG [9UXRAf95] [2] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:45.207 DEBUG [9UXRAf95] [2] [        main] c.x.u.service.CrawlerService   : 用户2消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:45.207 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
15:17:45.207 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580469184995329(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), yaoshibang(String), QUOTA(String), 2026-07-02T15:17:45.207897800(LocalDateTime)
15:17:45.210 DEBUG [9UXRAf95] [2] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:45.210  INFO [9UXRAf95] [2] [        main] c.x.u.s.DrugSearchService      : 用户 2 搜索药物: 阿莫西林胶囊, 平台: yaoshibang, 找到 1 条结果
15:17:45.216 DEBUG [9UXRAf95] [2] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 28ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.jHGRWwg0j7BCOlimrcsNhyTwJtGKbixZL7nkAiB6KH5lOzLiSoYQxE4h3lXSfgyJNRZzM7bO4aHh1YEA3cEqWQ", Content-Length:"59"]
             Body = {"keyword":"阿莫西林胶囊","platforms":["yaoshibang"]}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"9UXRAf95", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":12.50,"lowestPricePlatform":"药师帮","totalCount":1,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665214}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.224 DEBUG [MqkWmeSz] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.225 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.225 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:45.228 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.230 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.230 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:17:45.233 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.233 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.233 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
15:17:45.235 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.235 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.235 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.237 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.237 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.237 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 2(Long)
15:17:45.240 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.240 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.240 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 2(Long)
15:17:45.241 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.241 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.242 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 2(Long)
15:17:45.243 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.243 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.243 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 2(Long)
15:17:45.244 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.244 DEBUG [MqkWmeSz] [2] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:45.244 DEBUG [MqkWmeSz] [2] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
15:17:45.246 DEBUG [MqkWmeSz] [2] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:45.246 DEBUG [MqkWmeSz] [2] [        main] c.x.u.service.CrawlerService   : 用户2消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:45.247 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:45.247 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580469382127618(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.247131100(LocalDateTime)
15:17:45.249 DEBUG [MqkWmeSz] [2] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:45.250  INFO [MqkWmeSz] [2] [        main] c.x.u.s.DrugSearchService      : 用户 2 搜索药物: 布洛芬, 平台: null, 找到 3 条结果
15:17:45.255 DEBUG [MqkWmeSz] [2] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 31ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.jHGRWwg0j7BCOlimrcsNhyTwJtGKbixZL7nkAiB6KH5lOzLiSoYQxE4h3lXSfgyJNRZzM7bO4aHh1YEA3cEqWQ", Content-Length:"23"]
             Body = {"keyword":"布洛芬"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"MqkWmeSz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"keyword":"布洛芬","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":15.80,"spec":"0.3g*20粒/盒","manufacturer":"中美史克","expiry":"2027-12","moq":10,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaoshibang.com/search?q=布洛芬&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":14.90,"spec":"0.3g*20粒/盒","manufacturer":"中美史克","expiry":"2027-09","moq":5,"stockStatus":"LOW_STOCK","isLowest":false,"purchaseUrl":"https://www.yaobangmang.com/search?q=布洛芬&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":16.50,"spec":"0.3g*24粒/盒","manufacturer":"珠海联邦","expiry":"2028-01","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=布洛芬&ref=zhijiayun"}],"lowestPrice":15.80,"lowestPricePlatform":"药师帮","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665255}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.266 DEBUG [uw79CavX] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.267 DEBUG [uw79CavX] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.267 DEBUG [uw79CavX] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:45.269 DEBUG [uw79CavX] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.271  WARN [uw79CavX] [1] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 搜索关键词不能为空
15:17:45.271  WARN [uw79CavX] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 400 5ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0._Wg12DzhpkFmfAxTGa53YEih7j38oPv_6swi3FiQIZDquhsG-7bjWojOwifCuKLBZPuBFXsmqxAma60LRp16sg", Content-Length:"14"]
             Body = {"keyword":""}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"uw79CavX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"搜索关键词不能为空","data":null,"timestamp":1782976665271}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.276 DEBUG [gzLLXdSd] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.278  WARN [gzLLXdSd] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 401 2ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"26"]
             Body = {"keyword":"阿莫西林"}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"gzLLXdSd", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976665277}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.289 DEBUG [epBWSsGR] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.290 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.290 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9100(Long)
15:17:45.291 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.294 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.294 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9100(Long)
15:17:45.296 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.296 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.296 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
15:17:45.297 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.298 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.298 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.300 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.300 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.300 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9100(Long)
15:17:45.301 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.302 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.302 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9100(Long)
15:17:45.303 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.303 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.303 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9100(Long)
15:17:45.305 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.305 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.305 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9100(Long)
15:17:45.306 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.306 DEBUG [epBWSsGR] [9100] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:45.307 DEBUG [epBWSsGR] [9100] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
15:17:45.308 DEBUG [epBWSsGR] [9100] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:45.308 DEBUG [epBWSsGR] [9100] [        main] c.x.u.service.CrawlerService   : 用户9100消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:45.308 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:45.309 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580469633785858(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.308771500(LocalDateTime)
15:17:45.311 DEBUG [epBWSsGR] [9100] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:45.311  INFO [epBWSsGR] [9100] [        main] c.x.u.s.DrugSearchService      : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
15:17:45.317 DEBUG [epBWSsGR] [9100] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 28ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
             Body = {"keyword":"阿莫西林胶囊"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"epBWSsGR", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665316}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.317 DEBUG [rFt44e4w] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.321 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.321 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9100(Long)
15:17:45.323 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.323 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.323 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
15:17:45.325 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.325 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.325 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.327 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.327 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.327 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9100(Long)
15:17:45.329 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.330 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.330 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9100(Long)
15:17:45.331 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.332 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.332 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9100(Long)
15:17:45.334 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.334 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.334 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9100(Long)
15:17:45.335 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.335 DEBUG [rFt44e4w] [9100] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:45.335 DEBUG [rFt44e4w] [9100] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
15:17:45.337 DEBUG [rFt44e4w] [9100] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:45.337 DEBUG [rFt44e4w] [9100] [        main] c.x.u.service.CrawlerService   : 用户9100消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:45.337 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:45.337 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580469763809282(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.337849800(LocalDateTime)
15:17:45.340 DEBUG [rFt44e4w] [9100] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:45.340  INFO [rFt44e4w] [9100] [        main] c.x.u.s.DrugSearchService      : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
15:17:45.345 DEBUG [rFt44e4w] [9100] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 28ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
             Body = {"keyword":"阿莫西林胶囊"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"rFt44e4w", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665344}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.346 DEBUG [qVeLnKha] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.349 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.349 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9100(Long)
15:17:45.351 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.351 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.351 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
15:17:45.352 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.352 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.353 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.354 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.354 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.354 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9100(Long)
15:17:45.356 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.356 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.356 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9100(Long)
15:17:45.357 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.357 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.357 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9100(Long)
15:17:45.359 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.359 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.359 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9100(Long)
15:17:45.361 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.361 DEBUG [qVeLnKha] [9100] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:45.361 DEBUG [qVeLnKha] [9100] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
15:17:45.362 DEBUG [qVeLnKha] [9100] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:45.363 DEBUG [qVeLnKha] [9100] [        main] c.x.u.service.CrawlerService   : 用户9100消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:45.363 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:45.363 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580469893832705(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.363398700(LocalDateTime)
15:17:45.366 DEBUG [qVeLnKha] [9100] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:45.366  INFO [qVeLnKha] [9100] [        main] c.x.u.s.DrugSearchService      : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
15:17:45.371 DEBUG [qVeLnKha] [9100] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 25ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
             Body = {"keyword":"阿莫西林胶囊"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"qVeLnKha", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665370}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.372 DEBUG [PzwXp9eN] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.375 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.375 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9100(Long)
15:17:45.376 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.376 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.376 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
15:17:45.378 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.379 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.379 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.381 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.381 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.381 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9100(Long)
15:17:45.383 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.383 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.383 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9100(Long)
15:17:45.385 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.385 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.385 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9100(Long)
15:17:45.386 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.386 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.386 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9100(Long)
15:17:45.388 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.388 DEBUG [PzwXp9eN] [9100] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:45.388 DEBUG [PzwXp9eN] [9100] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
15:17:45.389 DEBUG [PzwXp9eN] [9100] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:45.389 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.service.CrawlerService   : 用户9100消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:45.390 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:45.390 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580469956747265(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.390467400(LocalDateTime)
15:17:45.393 DEBUG [PzwXp9eN] [9100] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:45.393  INFO [PzwXp9eN] [9100] [        main] c.x.u.s.DrugSearchService      : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
15:17:45.399 DEBUG [PzwXp9eN] [9100] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 27ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
             Body = {"keyword":"阿莫西林胶囊"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"PzwXp9eN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665398}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.399 DEBUG [uCg7cGwb] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.402 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.402 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9100(Long)
15:17:45.403 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.403 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.404 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
15:17:45.405 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.406 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.406 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.408 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.408 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.408 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9100(Long)
15:17:45.409 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.409 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.409 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9100(Long)
15:17:45.411 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.412 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.412 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9100(Long)
15:17:45.413 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.414 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.414 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9100(Long)
15:17:45.415 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.415 DEBUG [uCg7cGwb] [9100] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:45.416 DEBUG [uCg7cGwb] [9100] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
15:17:45.417 DEBUG [uCg7cGwb] [9100] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:45.417 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.service.CrawlerService   : 用户9100消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:45.418 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:45.418 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580470082576385(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.418509300(LocalDateTime)
15:17:45.421 DEBUG [uCg7cGwb] [9100] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:45.421  INFO [uCg7cGwb] [9100] [        main] c.x.u.s.DrugSearchService      : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
15:17:45.427 DEBUG [uCg7cGwb] [9100] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 28ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
             Body = {"keyword":"阿莫西林胶囊"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"uCg7cGwb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665425}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.427 DEBUG [H6CFAPV2] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.430 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.430 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9100(Long)
15:17:45.432 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.432 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.432 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
15:17:45.434 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.434 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.434 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.436 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.436 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.436 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9100(Long)
15:17:45.438 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.438 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.438 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9100(Long)
15:17:45.440 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.440 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.440 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9100(Long)
15:17:45.442 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.442 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.442 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9100(Long)
15:17:45.443 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.443 DEBUG [H6CFAPV2] [9100] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:45.443 DEBUG [H6CFAPV2] [9100] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
15:17:45.444 DEBUG [H6CFAPV2] [9100] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:45.445 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.service.CrawlerService   : 用户9100消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:45.445 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:45.445 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580470212599809(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.445349800(LocalDateTime)
15:17:45.447 DEBUG [H6CFAPV2] [9100] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:45.448  INFO [H6CFAPV2] [9100] [        main] c.x.u.s.DrugSearchService      : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
15:17:45.453 DEBUG [H6CFAPV2] [9100] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 26ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
             Body = {"keyword":"阿莫西林胶囊"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"H6CFAPV2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665452}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.454 DEBUG [jNBZbHYt] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.457 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.457 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9100(Long)
15:17:45.458 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.459 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.459 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
15:17:45.460 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.460 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.461 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.463 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.463 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.463 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9100(Long)
15:17:45.464 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.464 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.465 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9100(Long)
15:17:45.466 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.466 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.466 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9100(Long)
15:17:45.469 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.469 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.469 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9100(Long)
15:17:45.470 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.471 DEBUG [jNBZbHYt] [9100] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:45.471 DEBUG [jNBZbHYt] [9100] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
15:17:45.472 DEBUG [jNBZbHYt] [9100] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:45.472 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.service.CrawlerService   : 用户9100消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:45.473 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:45.473 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580470338428929(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.473396(LocalDateTime)
15:17:45.475 DEBUG [jNBZbHYt] [9100] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:45.475  INFO [jNBZbHYt] [9100] [        main] c.x.u.s.DrugSearchService      : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
15:17:45.480 DEBUG [jNBZbHYt] [9100] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 26ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
             Body = {"keyword":"阿莫西林胶囊"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"jNBZbHYt", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665480}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.481 DEBUG [aHyj6eUJ] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.484 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.484 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9100(Long)
15:17:45.485 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.485 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.485 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
15:17:45.487 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.488 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.488 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.489 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.489 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.490 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9100(Long)
15:17:45.491 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.491 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.491 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9100(Long)
15:17:45.492 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.492 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.492 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9100(Long)
15:17:45.493 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.493 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.493 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9100(Long)
15:17:45.495 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.495 DEBUG [aHyj6eUJ] [9100] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:45.495 DEBUG [aHyj6eUJ] [9100] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
15:17:45.496 DEBUG [aHyj6eUJ] [9100] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:45.497 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.service.CrawlerService   : 用户9100消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:45.497 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:45.497 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580470401343490(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.497017300(LocalDateTime)
15:17:45.499 DEBUG [aHyj6eUJ] [9100] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:45.499  INFO [aHyj6eUJ] [9100] [        main] c.x.u.s.DrugSearchService      : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
15:17:45.557 DEBUG [aHyj6eUJ] [9100] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 76ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
             Body = {"keyword":"阿莫西林胶囊"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"aHyj6eUJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665556}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.557 DEBUG [5vHXSnzD] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.560 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.560 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9100(Long)
15:17:45.562 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.562 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.562 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
15:17:45.563 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.564 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.564 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.567 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.568 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.568 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9100(Long)
15:17:45.569 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.569 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.569 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9100(Long)
15:17:45.570 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.570 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.570 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9100(Long)
15:17:45.571 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.571 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.571 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9100(Long)
15:17:45.572 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.572 DEBUG [5vHXSnzD] [9100] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:45.572 DEBUG [5vHXSnzD] [9100] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
15:17:45.573 DEBUG [5vHXSnzD] [9100] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:45.573 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.service.CrawlerService   : 用户9100消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:45.573 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:45.573 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580470724304898(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.573959500(LocalDateTime)
15:17:45.576 DEBUG [5vHXSnzD] [9100] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:45.576  INFO [5vHXSnzD] [9100] [        main] c.x.u.s.DrugSearchService      : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
15:17:45.594 DEBUG [5vHXSnzD] [9100] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 37ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
             Body = {"keyword":"阿莫西林胶囊"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"5vHXSnzD", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665593}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.595 DEBUG [Nfhe3Jz7] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.599 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.599 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9100(Long)
15:17:45.600 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.601 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.601 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
15:17:45.602 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.602 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.602 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.604 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.604 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.604 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9100(Long)
15:17:45.605 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.605 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.605 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9100(Long)
15:17:45.606 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.606 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.606 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9100(Long)
15:17:45.608 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.608 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.608 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9100(Long)
15:17:45.609 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.610 DEBUG [Nfhe3Jz7] [9100] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:45.610 DEBUG [Nfhe3Jz7] [9100] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
15:17:45.611 DEBUG [Nfhe3Jz7] [9100] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:45.611 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.service.CrawlerService   : 用户9100消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:45.611 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
15:17:45.612 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580470917242881(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.611953300(LocalDateTime)
15:17:45.614 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:45.614  INFO [Nfhe3Jz7] [9100] [        main] c.x.u.s.DrugSearchService      : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
15:17:45.619 DEBUG [Nfhe3Jz7] [9100] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 24ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
             Body = {"keyword":"阿莫西林胶囊"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Nfhe3Jz7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665619}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.620 DEBUG [72SD6BXE] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.624 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.624 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9100(Long)
15:17:45.626 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.626 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.626 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
15:17:45.627 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.628 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.628 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.630 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.630 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.630 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9100(Long)
15:17:45.631 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.632 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.632 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9100(Long)
15:17:45.633 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.633 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.633 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9100(Long)
15:17:45.634 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.634 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.634 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9100(Long)
15:17:45.635 DEBUG [72SD6BXE] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.639  WARN [72SD6BXE] [9100] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=4301, message=今日爬虫次数已用完
15:17:45.640 DEBUG [72SD6BXE] [9100] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 20ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
             Body = {"keyword":"阿莫西林胶囊"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"72SD6BXE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":4301,"message":"今日爬虫次数已用完","data":null,"timestamp":1782976665639}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.640 DEBUG [BkAuupGX] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query | IP: 127.0.0.1
15:17:45.644 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:45.644 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 9100(Long)
15:17:45.645 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:45.646 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:45.646 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
15:17:45.647 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:45.648 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:45.648 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:45.649 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:45.650 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:45.650 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 9100(Long)
15:17:45.652 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:45.652 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:45.652 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 9100(Long)
15:17:45.653 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:45.654 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:45.654 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 9100(Long)
15:17:45.655 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:45.655 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:45.655 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 9100(Long)
15:17:45.657 DEBUG [BkAuupGX] [9100] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:45.659  WARN [BkAuupGX] [9100] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=4301, message=今日爬虫次数已用完
15:17:45.660 DEBUG [BkAuupGX] [9100] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/search/query 200 20ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/search/query
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"29"]
             Body = {"keyword":"氯雷他定片"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"BkAuupGX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":4301,"message":"今日爬虫次数已用完","data":null,"timestamp":1782976665659}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.665 DEBUG [j8gMvGAj] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/search/suggestions | IP: 127.0.0.1
15:17:45.666 DEBUG [j8gMvGAj] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/search/suggestions 200 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/search/suggestions
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#suggestions()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"j8gMvGAj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":["阿莫西林胶囊","布洛芬缓释胶囊","头孢克肟分散片","奥美拉唑肠溶胶囊","硝苯地平控释片","氯雷他定片"],"timestamp":1782976665665}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:45.672 DEBUG [nXxHwhn5] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/search/suggestions | IP: 127.0.0.1
15:17:45.673 DEBUG [nXxHwhn5] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/search/suggestions 200 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/search/suggestions
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.DrugSearchController
           Method = com.xuekairui.user.controller.DrugSearchController#suggestions()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"nXxHwhn5", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":["阿莫西林胶囊","布洛芬缓释胶囊","头孢克肟分散片","奥美拉唑肠溶胶囊","硝苯地平控释片","氯雷他定片"],"timestamp":1782976665673}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.559 s -- in 药品搜索接口测试
[INFO] Running com.xuekairui.gateway.EndToEndBusinessFlowTest
15:17:45.677  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.EndToEndBusinessFlowTest]: EndToEndBusinessFlowTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:17:45.679  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.EndToEndBusinessFlowTest
15:17:48.786  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : 
========== 阶段1：用户注册 ==========
15:17:48.786 DEBUG [bYWTYe3a] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send | IP: 127.0.0.1
15:17:48.787  INFO [bYWTYe3a] [] [        main] .x.u.s.VerificationCodeService : 【验证码-测试模式】是否启用 true
15:17:48.789  INFO [bYWTYe3a] [] [        main] .x.u.s.VerificationCodeService : 【验证码-测试模式】手机号: 138****8000, 验证码: 123456 (固定), 场景: login, 有效期: 5分钟
15:17:48.790 DEBUG [bYWTYe3a] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send 200 4ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/send
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","scene":"login"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"bYWTYe3a", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976668789}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:48.790 DEBUG [MYCSc49d] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:17:48.793 DEBUG [MYCSc49d] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:17:48.793 DEBUG [MYCSc49d] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13800138000(String)
15:17:48.795 DEBUG [MYCSc49d] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 1
15:17:48.795 DEBUG [MYCSc49d] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
15:17:48.795 DEBUG [MYCSc49d] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:17:48.795064300(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:17:48(LocalDateTime), 2026-07-02T15:17:48(LocalDateTime), 1(Long)
15:17:48.798 DEBUG [MYCSc49d] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:17:48.799 DEBUG [MYCSc49d] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:17:48.799 DEBUG [MYCSc49d] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:17:48.795064300(LocalDateTime), 127.0.0.1(String), 1(Long), 19beddef6938c65c1fa71b46d57abe1883267e015858bb17ed6308cab0d6e509(String), ACTIVE(String), 2026-07-02T15:17:48(LocalDateTime), 2026-07-02T15:17:48(LocalDateTime), 1(Long)
15:17:48.801 DEBUG [MYCSc49d] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:17:48.802 DEBUG [MYCSc49d] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:48.802 DEBUG [MYCSc49d] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:48.803 DEBUG [MYCSc49d] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:48.804 DEBUG [MYCSc49d] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:48.804 DEBUG [MYCSc49d] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:48.805 DEBUG [MYCSc49d] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:48.806 DEBUG [MYCSc49d] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:48.806 DEBUG [MYCSc49d] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:48.807 DEBUG [MYCSc49d] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:48.808 DEBUG [MYCSc49d] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:48.808 DEBUG [MYCSc49d] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580484313849857(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:17:48.808331200(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:48.808331200(LocalDateTime)
15:17:48.811 DEBUG [MYCSc49d] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:48.811 DEBUG [MYCSc49d] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:17:48.817 DEBUG [MYCSc49d] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 27ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","code":"123456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"MYCSc49d", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzNTgxNDY4fQ.5WCYP1AZKEyWvlW4jL3wCvVGi5HC61a6O641K4oloZqc_sPg8wQLzYF5aYtJ6Wvp5yK66Rwrt-0MluAWzgBuSw","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:17:48","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976668815}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:48.817 DEBUG [u9GUgWAV] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:48.818 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:48.818 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:48.820 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:48.820 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:48.820 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:48.821 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:48.822 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:48.822 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:48.823 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:48.823 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:48.823 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:48.825 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:48.825 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:48.825 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:48.826 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:48.826 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:48.826 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:48.827 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:48.827 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:17:48.827 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:17:48.829 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:48.829 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:48.829 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:48.832 DEBUG [u9GUgWAV] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:48.832 DEBUG [u9GUgWAV] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:17:48.832 DEBUG [u9GUgWAV] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
15:17:48.833 DEBUG [u9GUgWAV] [1] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:17:48.834 DEBUG [u9GUgWAV] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 200 17ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"u9GUgWAV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976668833}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:48.834  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 阶段1完成: userId=1, 初始配额: 5次/天, 100次/月
15:17:48.837  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : 
========== 阶段2：绑定B2B平台账号 ==========
15:17:48.838 DEBUG [RPB5kbYL] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind | IP: 127.0.0.1
15:17:48.839 DEBUG [RPB5kbYL] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:48.839 DEBUG [RPB5kbYL] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:48.841 DEBUG [RPB5kbYL] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:48.842 DEBUG [RPB5kbYL] [1] [        main] .u.m.P.selectByUserAndPlatform : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
15:17:48.842 DEBUG [RPB5kbYL] [1] [        main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
15:17:48.844 DEBUG [RPB5kbYL] [1] [        main] .u.m.P.selectByUserAndPlatform : <==      Total: 0
15:17:48.845 DEBUG [RPB5kbYL] [1] [        main] c.x.u.m.P.insert               : ==>  Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:48.846 DEBUG [RPB5kbYL] [1] [        main] c.x.u.m.P.insert               : ==> Parameters: 2072580484443873282(Long), 1(Long), yaoshibang(String), 药师帮(String), IHR5Wl+d81ZzGqPk8Ntlhg3uawhA4AWpmId6DWBTdQjQ0Z+qae1Y(String), 31h/gnEkKkkpdetkt3lyVljZ3O3STNKF5xuBwt9d5SgatZl9dxzMFBs=(String), true(Boolean), PENDING(String), 2026-07-02T15:17:48.845656400(LocalDateTime), 2026-07-02T15:17:48.845656400(LocalDateTime)
15:17:48.849 DEBUG [RPB5kbYL] [1] [        main] c.x.u.m.P.insert               : <==    Updates: 1
15:17:48.849  INFO [RPB5kbYL] [1] [        main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaoshibang
15:17:48.855 DEBUG [RPB5kbYL] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:48.855 DEBUG [RPB5kbYL] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580484506787842(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:48.854874800(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:48.854874800(LocalDateTime)
15:17:48.860 DEBUG [RPB5kbYL] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:48.860 DEBUG [RPB5kbYL] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
15:17:48.860 DEBUG [RPB5kbYL] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind 200 22ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/platform-account/bind
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA", Content-Length:"107"]
             Body = {"account":"13800138000","platformName":"药师帮","platformCode":"yaoshibang","password":"test_password"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"RPB5kbYL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976668860}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:48.861 DEBUG [mE4g2z6A] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind | IP: 127.0.0.1
15:17:48.867 DEBUG [mE4g2z6A] [1] [        main] .u.m.P.selectByUserAndPlatform : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
15:17:48.867 DEBUG [mE4g2z6A] [1] [        main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaobangmang(String)
15:17:48.868 DEBUG [mE4g2z6A] [1] [        main] .u.m.P.selectByUserAndPlatform : <==      Total: 0
15:17:48.869 DEBUG [mE4g2z6A] [1] [        main] c.x.u.m.P.insert               : ==>  Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:48.869 DEBUG [mE4g2z6A] [1] [        main] c.x.u.m.P.insert               : ==> Parameters: 2072580484582285314(Long), 1(Long), yaobangmang(String), 药帮忙(String), CNuPOegNewrwpdskE1blVOThy6ai2nx7jqTRTgYaSS6o43YbPCpD(String), A025jUlQHfHIV+ZkbYffaq20wOMLyzglCEqgtkq9B/eRMEzDuzkjS9Q=(String), true(Boolean), PENDING(String), 2026-07-02T15:17:48.869503700(LocalDateTime), 2026-07-02T15:17:48.869503700(LocalDateTime)
15:17:48.871 DEBUG [mE4g2z6A] [1] [        main] c.x.u.m.P.insert               : <==    Updates: 1
15:17:48.871  INFO [mE4g2z6A] [1] [        main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaobangmang
15:17:48.874 DEBUG [mE4g2z6A] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:48.875 DEBUG [mE4g2z6A] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580484582285315(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:48.874944200(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaobangmang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:48.874944200(LocalDateTime)
15:17:48.879 DEBUG [mE4g2z6A] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:48.879 DEBUG [mE4g2z6A] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
15:17:48.880 DEBUG [mE4g2z6A] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind 200 19ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/platform-account/bind
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA", Content-Length:"108"]
             Body = {"account":"13900139000","platformName":"药帮忙","platformCode":"yaobangmang","password":"test_password"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"mE4g2z6A", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976668879}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:48.881 DEBUG [ArUB5EsA] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-account/list | IP: 127.0.0.1
15:17:48.882 DEBUG [ArUB5EsA] [1] [        main] c.x.u.m.P.selectByUserId       : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
15:17:48.882 DEBUG [ArUB5EsA] [1] [        main] c.x.u.m.P.selectByUserId       : ==> Parameters: 1(Long)
15:17:48.884 DEBUG [ArUB5EsA] [1] [        main] c.x.u.m.P.selectByUserId       : <==      Total: 2
15:17:48.884 DEBUG [ArUB5EsA] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-account/list 200 3ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/platform-account/list
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ArUB5EsA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":2072580484582285314,"platformCode":"yaobangmang","platformName":"药帮忙","account":"139****9000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:49"},{"id":2072580484443873282,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:49"}],"timestamp":1782976668884}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:48.885  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 阶段2完成: 已绑定2个B2B平台
15:17:48.887  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : 
========== 阶段3：上传营业执照 ==========
15:17:48.888 DEBUG [ATNYRvQf] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/business-license/upload | IP: 127.0.0.1
15:17:48.889 DEBUG [ATNYRvQf] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:48.889 DEBUG [ATNYRvQf] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:48.891 DEBUG [ATNYRvQf] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:48.892 DEBUG [ATNYRvQf] [1] [        main] c.x.u.m.B.selectByUserId       : ==>  Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
15:17:48.892 DEBUG [ATNYRvQf] [1] [        main] c.x.u.m.B.selectByUserId       : ==> Parameters: 1(Long)
15:17:48.893 DEBUG [ATNYRvQf] [1] [        main] c.x.u.m.B.selectByUserId       : <==      Total: 0
15:17:48.894 DEBUG [ATNYRvQf] [1] [        main] c.x.u.m.B.insert               : ==>  Preparing: INSERT INTO t_business_license ( user_id, license_image_url, credit_code, pharmacy_name, legal_person, review_status, show_verified_badge, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:48.894 DEBUG [ATNYRvQf] [1] [        main] c.x.u.m.B.insert               : ==> Parameters: 1(Long), https://oss.example.com/license/test.jpg(String), 91110000XXXXXXXXXX(String), 测试大药房(String), 张三(String), PENDING(String), false(Boolean), 2026-07-02T15:17:48.894812800(LocalDateTime), 2026-07-02T15:17:48.894812800(LocalDateTime)
15:17:48.899 DEBUG [ATNYRvQf] [1] [        main] c.x.u.m.B.insert               : <==    Updates: 1
15:17:48.900 DEBUG [ATNYRvQf] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/business-license/upload 200 12ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/business-license/upload
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA", Content-Length:"152"]
             Body = {"licenseImageUrl":"https://oss.example.com/license/test.jpg","creditCode":"91110000XXXXXXXXXX","pharmacyName":"测试大药房","legalPerson":"张三"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.BusinessLicenseController
           Method = com.xuekairui.user.controller.BusinessLicenseController#upload(UploadRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ATNYRvQf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976668899}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:48.900 DEBUG [uqEFraqA] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/business-license/info | IP: 127.0.0.1
15:17:48.902 DEBUG [uqEFraqA] [1] [        main] c.x.u.m.B.selectByUserId       : ==>  Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
15:17:48.902 DEBUG [uqEFraqA] [1] [        main] c.x.u.m.B.selectByUserId       : ==> Parameters: 1(Long)
15:17:48.903 DEBUG [uqEFraqA] [1] [        main] c.x.u.m.B.selectByUserId       : <==      Total: 1
15:17:48.904 DEBUG [uqEFraqA] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/business-license/info 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/business-license/info
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.BusinessLicenseController
           Method = com.xuekairui.user.controller.BusinessLicenseController#getInfo(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"uqEFraqA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"userId":1,"licenseImageUrl":"https://oss.example.com/license/test.jpg","creditCode":"91110000XXXXXXXXXX","pharmacyName":"测试大药房","legalPerson":"张三","registeredAddress":null,"businessScope":null,"validFrom":null,"validTo":null,"reviewStatus":"PENDING","reviewerId":null,"reviewTime":null,"rejectReason":null,"showVerifiedBadge":false,"remark":null,"createTime":"2026-07-02 15:17:49","updateTime":"2026-07-02 15:17:49"},"timestamp":1782976668903}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:48.904  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 阶段3完成: 营业执照已提交，待审核
15:17:48.906  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : 
========== 阶段4：邀请裂变 ==========
15:17:48.907 DEBUG [228tmmP4] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/code | IP: 127.0.0.1
15:17:48.907 DEBUG [228tmmP4] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:48.907 DEBUG [228tmmP4] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:48.909 DEBUG [228tmmP4] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:48.911 DEBUG [228tmmP4] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
15:17:48.911 DEBUG [228tmmP4] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:17:48.910675900(LocalDateTime)
15:17:48.913 DEBUG [228tmmP4] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:17:48.913 DEBUG [228tmmP4] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:17:48.913 DEBUG [228tmmP4] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:17:48.914 DEBUG [228tmmP4] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:48.915 DEBUG [228tmmP4] [1] [        main] c.x.i.m.I.selectCount          : ==>  Preparing: SELECT COUNT( * ) AS total FROM t_invite_code WHERE (code = ?)
15:17:48.915 DEBUG [228tmmP4] [1] [        main] c.x.i.m.I.selectCount          : ==> Parameters: 5YZ8LMEM(String)
15:17:48.916 DEBUG [228tmmP4] [1] [        main] c.x.i.m.I.selectCount          : <==      Total: 1
15:17:48.916 DEBUG [228tmmP4] [1] [        main] c.x.i.m.I.insert               : ==>  Preparing: INSERT INTO t_invite_code ( user_id, code, max_uses, used_count, click_count, expire_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:48.916 DEBUG [228tmmP4] [1] [        main] c.x.i.m.I.insert               : ==> Parameters: 1(Long), 5YZ8LMEM(String), -1(Integer), 0(Integer), 0(Integer), 2026-08-01T15:17:48.914933900(LocalDateTime), 1(Integer), 2026-07-02T15:17:48.916531800(LocalDateTime), 2026-07-02T15:17:48.916531800(LocalDateTime)
15:17:48.920 DEBUG [228tmmP4] [1] [        main] c.x.i.m.I.insert               : <==    Updates: 1
15:17:48.920  INFO [228tmmP4] [1] [        main] c.x.i.service.InviteService    : 用户 1 创建邀请码: 5YZ8LMEM
15:17:48.920 DEBUG [228tmmP4] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:17:48.920 DEBUG [228tmmP4] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:17:48.921 DEBUG [228tmmP4] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:48.922 DEBUG [228tmmP4] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:48.922 DEBUG [228tmmP4] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:48.923 DEBUG [228tmmP4] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:48.925 DEBUG [228tmmP4] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/code 200 18ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/code
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"228tmmP4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"code":"5YZ8LMEM","inviteLink":"https://app.zhijiayun.com/api/invite/5YZ8LMEM","inviterNickname":"测试用户","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:17:48","status":1,"createTime":"2026-07-02 15:17:48","shareTitle":"测试用户 邀请你加入智价云（药店版）","shareDescription":"登录智价云（药店版），邀请好友各得好礼","copyText":"我是测试用户，在这里发现了一个药店采购神器——智价云（药店版）！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/5YZ8LMEM填我的邀请码 5YZ8LMEM 完成注册，你也会获得会员权益！","rewardDescription":"邀请人每成功邀请1家药店注册，赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/5YZ8LMEM"},"timestamp":1782976668923}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:48.925  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 邀请码: 5YZ8LMEM
15:17:48.925 DEBUG [BycXFeCy] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:17:48.929 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:17:48.929 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13912345678(String)
15:17:48.930 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 0
15:17:48.931 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.insert      : ==>  Preparing: INSERT INTO t_user ( id, phone, nickname, login_source, status, role, membership_level, token_version, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:48.931 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.insert      : ==> Parameters: 2072580484829749249(Long), 13912345678(String), 用户5678(String), SMS(String), 1(Integer), USER(String), PLUS(String), 0(Long), 2026-07-02T15:17:48.931019600(LocalDateTime), 2026-07-02T15:17:48.931019600(LocalDateTime)
15:17:48.933 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.insert      : <==    Updates: 1
15:17:48.933  INFO [BycXFeCy] [] [        main] c.x.i.l.UserRegisteredListener : 收到用户注册事件: userId=2072580484829749249, inviteCode=5YZ8LMEM
15:17:48.934 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
15:17:48.934 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: 5YZ8LMEM(String)
15:17:48.935 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:48.936 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:48.936 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2072580484829749249(Long)
15:17:48.936 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:48.937 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.selectCount          : ==>  Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (invitee_id = ?)
15:17:48.937 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.selectCount          : ==> Parameters: 2072580484829749249(Long)
15:17:48.938 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.selectCount          : <==      Total: 1
15:17:48.939 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:17:48.939 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:17:48.941 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:48.942 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.selectCount          : ==>  Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND registered = ?)
15:17:48.942 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.selectCount          : ==> Parameters: 1(Long), 1(Integer)
15:17:48.944 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.selectCount          : <==      Total: 1
15:17:48.944 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.insert               : ==>  Preparing: INSERT INTO t_invite_relation ( inviter_id, invitee_id, invite_code_id, registered, reward_granted, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )
15:17:48.945 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.insert               : ==> Parameters: 1(Long), 2072580484829749249(Long), 1(Long), 1(Integer), 1(Integer), 1(Integer), 2026-07-02T15:17:48.944892300(LocalDateTime), 2026-07-02T15:17:48.944892300(LocalDateTime)
15:17:48.947 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.insert               : <==    Updates: 1
15:17:48.948 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.updateById           : ==>  Preparing: UPDATE t_invite_code SET user_id=?, code=?, max_uses=?, used_count=?, click_count=?, expire_time=?, status=?, create_time=?, update_time=? WHERE id=?
15:17:48.948 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.updateById           : ==> Parameters: 1(Long), 5YZ8LMEM(String), -1(Integer), 1(Integer), 0(Integer), 2026-08-01T15:17:49(LocalDateTime), 1(Integer), 2026-07-02T15:17:49(LocalDateTime), 2026-07-02T15:17:49(LocalDateTime), 1(Long)
15:17:48.951 DEBUG [BycXFeCy] [] [        main] c.x.i.m.I.updateById           : <==    Updates: 1
15:17:48.951 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:48.951 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:48.952 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:48.952 DEBUG [BycXFeCy] [] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:48.952 DEBUG [BycXFeCy] [] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:48.954 DEBUG [BycXFeCy] [] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:48.954 DEBUG [BycXFeCy] [] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
15:17:48.954 DEBUG [BycXFeCy] [] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long), 1(Integer)
15:17:48.955 DEBUG [BycXFeCy] [] [        main] c.x.u.m.U.selectList           : <==      Total: 0
15:17:48.956 DEBUG [BycXFeCy] [] [        main] c.x.u.m.U.insert               : ==>  Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, effective_to, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:48.956 DEBUG [BycXFeCy] [] [        main] c.x.u.m.U.insert               : ==> Parameters: 2072580484963966977(Long), 1(Long), PRO(String), INVITE(String), 2026-07-02T15:17:48.956245100(LocalDateTime), 2026-08-01T15:17:48.956245100(LocalDateTime), 1(Integer), 邀请奖励：邀请用户2072580484829749249注册(String), 2026-07-02T15:17:48.956245100(LocalDateTime), 2026-07-02T15:17:48.956245100(LocalDateTime)
15:17:48.958 DEBUG [BycXFeCy] [] [        main] c.x.u.m.U.insert               : <==    Updates: 1
15:17:48.958 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:17:48.959 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:17:48.956245100(LocalDateTime), 2026-07-02T15:17:49(LocalDateTime), 127.0.0.1(String), 1(Long), 19beddef6938c65c1fa71b46d57abe1883267e015858bb17ed6308cab0d6e509(String), ACTIVE(String), 2026-07-02T15:17:48(LocalDateTime), 2026-07-02T15:17:48(LocalDateTime), 1(Long)
15:17:48.961 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:17:48.961  INFO [BycXFeCy] [] [        main] c.x.u.s.MembershipService      : 邀请奖励：用户1获得30天高级会员(PRO)
15:17:48.961  INFO [BycXFeCy] [] [        main] c.x.i.service.InviteService    : 邀请奖励已发放: inviter=1, invitee=2072580484829749249, 会员=PRO/30天, 配额=0次
15:17:48.961  INFO [BycXFeCy] [] [        main] c.x.i.service.InviteService    : 邀请成功: inviter=1, invitee=2072580484829749249
15:17:48.961 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, inviter_id=?, token_version=?, create_time=?, update_time=? WHERE id=?
15:17:48.962 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13912345678(String), 用户5678(String), SMS(String), 1(Integer), USER(String), PLUS(String), 1(Long), 0(Long), 2026-07-02T15:17:49(LocalDateTime), 2026-07-02T15:17:49(LocalDateTime), 2072580484829749249(Long)
15:17:48.964 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:17:48.964 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
15:17:48.965 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13912345678(String), 用户5678(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:17:48.964233700(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:17:48.931019600(LocalDateTime), 2026-07-02T15:17:48.931019600(LocalDateTime), 2072580484829749249(Long)
15:17:48.966 DEBUG [BycXFeCy] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:17:48.968 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:17:48.968 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13912345678(String), 用户5678(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:17:48.964233700(LocalDateTime), 127.0.0.1(String), 1(Long), cb8ac91cda3091b1af1b5b555c3919acc9881bae250ffe19884beb95407c7fb9(String), ACTIVE(String), 2026-07-02T15:17:48.931019600(LocalDateTime), 2026-07-02T15:17:48.931019600(LocalDateTime), 2072580484829749249(Long)
15:17:48.970 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:17:48.970 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:48.970 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2072580484829749249(Long)
15:17:48.971 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:48.972 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:48.972 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580484829749249(Long)
15:17:48.973 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:17:48.974 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:48.974 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:48.975 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:48.975 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:48.975 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580485026881537(Long), 2072580484829749249(Long), 用户5678(String), USER(String), 2026-07-02T15:17:48.975628300(LocalDateTime), USER(String), REGISTER(String), 用户注册(String), USER(String), 2072580484829749249(Long), USER:2072580484829749249(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:48.975628300(LocalDateTime)
15:17:48.977 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:48.977 DEBUG [BycXFeCy] [2072580484829749249] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户注册
15:17:48.977 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:48.977 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580485026881538(Long), 2072580484829749249(Long), 用户5678(String), USER(String), 2026-07-02T15:17:48.977733500(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 2072580484829749249(Long), USER:2072580484829749249(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:48.977733500(LocalDateTime)
15:17:48.979 DEBUG [BycXFeCy] [2072580484829749249] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:48.979 DEBUG [BycXFeCy] [2072580484829749249] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:17:48.984 DEBUG [BycXFeCy] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 59ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"63"]
             Body = {"phone":"13912345678","inviteCode":"5YZ8LMEM","code":"123456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"BycXFeCy", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":2072580484829749249,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDQ4NDgyOTc0OTI0OSwic3ViIjoiMjA3MjU4MDQ4NDgyOTc0OTI0OSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.0f0sa1_nYWram4ZHRBZ0qgAyXBjstiRbbDkc2F590wa667GEuNZ3R0BE43X5oBTwWrUQZTICawZV2jax73zGKw","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MjA3MjU4MDQ4NDgyOTc0OTI0OSwic3ViIjoiMjA3MjU4MDQ4NDgyOTc0OTI0OSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzNTgxNDY4fQ.Vp24hmMW7FKuKnZJIeZKt44kxXsFu2Q-tKHfKxVp62If5nKwUx-J1EP7WVxZy8U00DIgdkQGr_nxqM7JYFuJ5g","expiresIn":86400,"userInfo":{"id":2072580484829749249,"phone":"139****5678","nickname":"用户5678","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:17:48","loginSource":"SMS","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":2072580484829749249,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":true,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976668984}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:48.985  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 阶段4完成: 成功邀请1位新用户
15:17:48.987  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : 
========== 阶段5：查看邀请奖励 ==========
15:17:48.987 DEBUG [ggDcXz9g] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/stats | IP: 127.0.0.1
15:17:48.988 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:48.988 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:48.991 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:48.991 DEBUG [ggDcXz9g] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:17:48.991 DEBUG [ggDcXz9g] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:17:48.993 DEBUG [ggDcXz9g] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:48.993 DEBUG [ggDcXz9g] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
15:17:48.993 DEBUG [ggDcXz9g] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:17:48.993167400(LocalDateTime)
15:17:48.995 DEBUG [ggDcXz9g] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:48.995 DEBUG [ggDcXz9g] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:17:48.995 DEBUG [ggDcXz9g] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:17:48.996 DEBUG [ggDcXz9g] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:48.996 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:48.996 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:48.998 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:48.999 DEBUG [ggDcXz9g] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
15:17:48.999 DEBUG [ggDcXz9g] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long)
15:17:49.000 DEBUG [ggDcXz9g] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:17:49.001 DEBUG [ggDcXz9g] [1] [        main] c.x.i.m.I.selectCount          : ==>  Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND create_time >= ?)
15:17:49.001 DEBUG [ggDcXz9g] [1] [        main] c.x.i.m.I.selectCount          : ==> Parameters: 1(Long), 2026-07-02T00:00(LocalDateTime)
15:17:49.003 DEBUG [ggDcXz9g] [1] [        main] c.x.i.m.I.selectCount          : <==      Total: 1
15:17:49.003 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:49.004 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:49.005 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:49.006 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:49.006 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:49.007 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 1
15:17:49.007 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:49.007 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:49.009 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:49.009 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:49.009 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:49.010 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:49.010 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:49.010 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:49.012 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:49.012 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:49.012 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:49.012 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:49.013 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:17:49.013 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:17:49.015 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:49.015 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:49.015 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:49.016 DEBUG [ggDcXz9g] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:49.016 DEBUG [ggDcXz9g] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:17:49.016 DEBUG [ggDcXz9g] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
15:17:49.017 DEBUG [ggDcXz9g] [1] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:17:49.020 DEBUG [ggDcXz9g] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/stats 200 33ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/stats
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getInviteStats(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ggDcXz9g", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"myInviteCode":"5YZ8LMEM","inviteLink":"https://app.zhijiayun.com/api/invite/5YZ8LMEM","clickedCount":0,"totalInvited":1,"registeredCount":1,"totalReward":1,"summaryText":"已邀请1家药店，1家注册，累计获得1个月高级会员","todayInvited":1,"todayRemaining":9,"rewardPerInvite":1,"crawlerTodayRemaining":999,"crawlerQuotaFromInvites":0},"timestamp":1782976669019}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:49.021 DEBUG [YDC3CuEG] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:49.022 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:49.023 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:49.025 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:49.025 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:49.025 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:49.026 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 1
15:17:49.027 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:49.027 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:49.029 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:49.029 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:49.030 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:49.031 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:49.031 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:49.031 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:49.032 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:49.032 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:49.032 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:49.034 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:49.034 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:17:49.034 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:17:49.036 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:49.037 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:49.037 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:49.038 DEBUG [YDC3CuEG] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:49.038 DEBUG [YDC3CuEG] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:17:49.038 DEBUG [YDC3CuEG] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
15:17:49.039 DEBUG [YDC3CuEG] [1] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:17:49.040 DEBUG [YDC3CuEG] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 200 19ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"YDC3CuEG", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"levelName":"高级会员","levelCode":"PRO","todayUsed":0,"todayQuota":999,"todayRemaining":999,"monthUsed":0,"monthQuota":29970,"monthRemaining":29970,"yearUsed":0,"yearQuota":364635,"yearRemaining":364635,"baseDailyQuota":999,"baseMonthlyQuota":29970,"baseYearlyQuota":364635,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":5,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976669039}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:49.040  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 阶段5完成: 已获得邀请奖励
15:17:49.043  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : 
========== 阶段6：消耗配额比价 ==========
15:17:49.043 DEBUG [Bgz9XUNz] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:17:49.043 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:49.043 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:49.046 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:49.049 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:49.049 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:49.051 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:49.051 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:49.051 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:49.053 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 1
15:17:49.053 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:49.054 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:49.055 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:49.055 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:49.055 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:49.056 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:49.056 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:49.056 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:49.057 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:49.057 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:49.057 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:49.058 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:49.059 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:49.059 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:49.059 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:49.059 DEBUG [Bgz9XUNz] [1] [        main] .m.C.findEarliestExpiringGrant : ==>  Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
15:17:49.059 DEBUG [Bgz9XUNz] [1] [        main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
15:17:49.060 DEBUG [Bgz9XUNz] [1] [        main] .m.C.findEarliestExpiringGrant : <==      Total: 0
15:17:49.060 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.service.CrawlerService   : 用户1消耗配额1次: 额外配额扣减0次，等级配额扣减1次
15:17:49.060 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.C.insert               : ==>  Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
15:17:49.061 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.C.insert               : ==> Parameters: 2072580485354037249(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), yaoshibang(String), QUOTA(String), 2026-07-02T15:17:49.060619(LocalDateTime)
15:17:49.062 DEBUG [Bgz9XUNz] [1] [        main] c.x.u.m.C.insert               : <==    Updates: 1
15:17:49.067 DEBUG [Bgz9XUNz] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 200 24ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA", Content-Length:"35"]
             Body = {"count":1,"platform":"yaoshibang"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Bgz9XUNz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976669067}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:49.068 DEBUG [33A9hQ7S] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:49.069 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:49.069 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:49.070 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:49.070 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:49.071 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:49.072 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 1
15:17:49.072 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:49.072 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:49.073 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:49.074 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:17:49.074 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:17:49.074 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:17:49.074 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:17:49.074 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:17:49.076 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:17:49.076 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:17:49.076 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:17:49.077 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:17:49.077 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:17:49.078 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:17:49.079 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:17:49.080 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:17:49.080 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:17:49.081 DEBUG [33A9hQ7S] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:17:49.081 DEBUG [33A9hQ7S] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:17:49.081 DEBUG [33A9hQ7S] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
15:17:49.083 DEBUG [33A9hQ7S] [1] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:17:49.083 DEBUG [33A9hQ7S] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 200 15ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"33A9hQ7S", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"levelName":"高级会员","levelCode":"PRO","todayUsed":1,"todayQuota":999,"todayRemaining":998,"monthUsed":1,"monthQuota":29970,"monthRemaining":29969,"yearUsed":1,"yearQuota":364635,"yearRemaining":364634,"baseDailyQuota":999,"baseMonthlyQuota":29970,"baseYearlyQuota":364635,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":5,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976669083}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:49.084  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 阶段6完成: 消耗1次配额，剩余4次/天
15:17:49.087  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : 
========== 阶段7：管理员审核 ==========
15:17:49.091 DEBUG [ZHwx5Kbr] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:17:49.095 DEBUG [ZHwx5Kbr] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:17:49.095 DEBUG [ZHwx5Kbr] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13800138000(String)
15:17:49.097 DEBUG [ZHwx5Kbr] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 1
15:17:49.098 DEBUG [ZHwx5Kbr] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:17:49.098 DEBUG [ZHwx5Kbr] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:17:49(LocalDateTime), 2026-07-02T15:17:49.098235800(LocalDateTime), 127.0.0.1(String), 0(Long), 19beddef6938c65c1fa71b46d57abe1883267e015858bb17ed6308cab0d6e509(String), ACTIVE(String), 2026-07-02T15:17:48(LocalDateTime), 2026-07-02T15:17:48(LocalDateTime), 1(Long)
15:17:49.101 DEBUG [ZHwx5Kbr] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:17:49.102 DEBUG [ZHwx5Kbr] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:17:49.102 DEBUG [ZHwx5Kbr] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:17:49(LocalDateTime), 2026-07-02T15:17:49.098235800(LocalDateTime), 127.0.0.1(String), 1(Long), d6468a01aae3df5116c23a4e214bb21f443355a228f6afae09510f159cafa733(String), ACTIVE(String), 2026-07-02T15:17:48(LocalDateTime), 2026-07-02T15:17:48(LocalDateTime), 1(Long)
15:17:49.105 DEBUG [ZHwx5Kbr] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:17:49.105 DEBUG [ZHwx5Kbr] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:49.105 DEBUG [ZHwx5Kbr] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:49.107 DEBUG [ZHwx5Kbr] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:49.107 DEBUG [ZHwx5Kbr] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:49.107 DEBUG [ZHwx5Kbr] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:49.108 DEBUG [ZHwx5Kbr] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 1
15:17:49.109 DEBUG [ZHwx5Kbr] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:49.109 DEBUG [ZHwx5Kbr] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:49.111 DEBUG [ZHwx5Kbr] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:49.112 DEBUG [ZHwx5Kbr] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:17:49.112 DEBUG [ZHwx5Kbr] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580485605695490(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:17:49.111596200(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:49.111596200(LocalDateTime)
15:17:49.114 DEBUG [ZHwx5Kbr] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:17:49.114 DEBUG [ZHwx5Kbr] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:17:49.119 DEBUG [ZHwx5Kbr] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 28ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","code":"123456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ZHwx5Kbr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OSwiZXhwIjoxNzgzMDYzMDY5fQ.r4HvNsmZlUwmpdoEVnxz7eyEViBEEx4IroiXbt09H9Eu76mg7MS7V7RGfgghurTFmNNtSpB8V0MR_PdIZ_JwCA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OSwiZXhwIjoxNzgzNTgxNDY5fQ.h6GF9oDhsKICOcF7zKbfEdJa0tzNSvQoBvKtZXnRvYBwDvZsj7-8sRgMg8p8MDJqX4Sj0Ksb1Y2kS58huBt7pA","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":"2026-08-01 15:17:49","membershipDaysRemaining":29,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},"createTime":"2026-07-02 15:17:48","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PRO","membershipLevelName":"高级会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PRO","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976669118}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:49.119 DEBUG [4jwdDJSZ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/license/review?reviewStatus=PENDING | IP: 127.0.0.1
15:17:49.120  INFO [4jwdDJSZ] [1] [        main] .x.u.s.JwtAuthenticationFilter : 用户 1 的Token版本号不匹配（已在其他设备登录），拒绝访问
15:17:49.121  WARN [4jwdDJSZ] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/license/review?reviewStatus=PENDING 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/license/review
       Parameters = {reviewStatus=[PENDING]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjksImV4cCI6MTc4MzA2MzA2OX0.Qp3W55oPpHZXEFEZtKduqKHCEZNLPIX_-FFhYec3LD9z3G9XIOnXitFV1LL2F2FSrybOQ0ssx9Ye96V2IRERmw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"4jwdDJSZ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":1304,"message":"您的账号已在其他设备登录，当前会话已失效，请重新登录","data":null,"timestamp":1782976669120}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","code":"123456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ZHwx5Kbr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OSwiZXhwIjoxNzgzMDYzMDY5fQ.r4HvNsmZlUwmpdoEVnxz7eyEViBEEx4IroiXbt09H9Eu76mg7MS7V7RGfgghurTFmNNtSpB8V0MR_PdIZ_JwCA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OSwiZXhwIjoxNzgzNTgxNDY5fQ.h6GF9oDhsKICOcF7zKbfEdJa0tzNSvQoBvKtZXnRvYBwDvZsj7-8sRgMg8p8MDJqX4Sj0Ksb1Y2kS58huBt7pA","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":"2026-08-01 15:17:49","membershipDaysRemaining":29,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},"createTime":"2026-07-02 15:17:48","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PRO","membershipLevelName":"高级会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PRO","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976669118}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/license/review
       Parameters = {reviewStatus=[PENDING]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjksImV4cCI6MTc4MzA2MzA2OX0.Qp3W55oPpHZXEFEZtKduqKHCEZNLPIX_-FFhYec3LD9z3G9XIOnXitFV1LL2F2FSrybOQ0ssx9Ye96V2IRERmw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"4jwdDJSZ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":1304,"message":"您的账号已在其他设备登录，当前会话已失效，请重新登录","data":null,"timestamp":1782976669120}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:49.124  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : 
========== 阶段8：查看操作审计日志 ==========
15:17:49.125 DEBUG [TjEHfpJQ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/user/1 | IP: 127.0.0.1
15:17:49.126 DEBUG [TjEHfpJQ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:49.126 DEBUG [TjEHfpJQ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:49.128 DEBUG [TjEHfpJQ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:49.128  INFO [TjEHfpJQ] [1] [        main] .x.u.s.JwtAuthenticationFilter : 用户 1 的Token版本号不匹配（已在其他设备登录），拒绝访问
15:17:49.129  WARN [TjEHfpJQ] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/user/1 401 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/user/1
       Parameters = {limit=[50]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjksImV4cCI6MTc4MzA2MzA2OX0.Qp3W55oPpHZXEFEZtKduqKHCEZNLPIX_-FFhYec3LD9z3G9XIOnXitFV1LL2F2FSrybOQ0ssx9Ye96V2IRERmw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"TjEHfpJQ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":1304,"message":"您的账号已在其他设备登录，当前会话已失效，请重新登录","data":null,"timestamp":1782976669128}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/user/1
       Parameters = {limit=[50]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjksImV4cCI6MTc4MzA2MzA2OX0.Qp3W55oPpHZXEFEZtKduqKHCEZNLPIX_-FFhYec3LD9z3G9XIOnXitFV1LL2F2FSrybOQ0ssx9Ye96V2IRERmw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"TjEHfpJQ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":1304,"message":"您的账号已在其他设备登录，当前会话已失效，请重新登录","data":null,"timestamp":1782976669128}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:49.133  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : 
========== 阶段9：查看完整用户信息 ==========
15:17:49.133 DEBUG [AttSvmWJ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info | IP: 127.0.0.1
15:17:49.133 DEBUG [AttSvmWJ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:49.133 DEBUG [AttSvmWJ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:49.135 DEBUG [AttSvmWJ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:49.137 DEBUG [AttSvmWJ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:49.137 DEBUG [AttSvmWJ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:49.138 DEBUG [AttSvmWJ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:49.139 DEBUG [AttSvmWJ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:49.139 DEBUG [AttSvmWJ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:49.140 DEBUG [AttSvmWJ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:49.141 DEBUG [AttSvmWJ] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:17:49.141 DEBUG [AttSvmWJ] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:17:49.143 DEBUG [AttSvmWJ] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 1
15:17:49.143 DEBUG [AttSvmWJ] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:49.143 DEBUG [AttSvmWJ] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:49.145 DEBUG [AttSvmWJ] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:49.145 DEBUG [AttSvmWJ] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info 200 12ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/user/info
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OSwiZXhwIjoxNzgzMDYzMDY5fQ.r4HvNsmZlUwmpdoEVnxz7eyEViBEEx4IroiXbt09H9Eu76mg7MS7V7RGfgghurTFmNNtSpB8V0MR_PdIZ_JwCA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#getUserInfo(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"AttSvmWJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":"2026-08-01 15:17:49","membershipDaysRemaining":29,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},"createTime":"2026-07-02 15:17:48","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PRO","membershipLevelName":"高级会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PRO","version":null},"timestamp":1782976669145}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:49.146  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 阶段9完成: 用户信息完整
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : 
========== ? 端到端业务流程测试完成 ==========
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 阶段1: 用户注册 - 完成
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 阶段2: 绑定B2B平台账号 - 完成
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 阶段3: 上传营业执照 - 完成
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 阶段4: 邀请裂变 - 完成
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 阶段5: 获得邀请奖励 - 完成
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 阶段6: 消耗配额比价 - 完成
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 阶段7: 管理员审核 - 完成
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 阶段8: 操作审计日志 - 完成
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : ? 阶段9: 用户完整信息 - 完成
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : 
? 测试覆盖:
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest :    - 用户认证流程 ?
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest :    - B2B平台账号绑定 ?
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest :    - 营业执照上传 ?
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest :    - 邀请裂变系统 ?
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest :    - 配额管理 ?
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest :    - 操作审计日志 ?
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest :    - 多端支持字段 ?
15:17:49.149  INFO [] [] [        main] c.x.g.EndToEndBusinessFlowTest : 
? 全流程测试通过！
[ERROR] Tests run: 10, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 3.475 s <<< FAILURE! -- in com.xuekairui.gateway.EndToEndBusinessFlowTest
[ERROR] com.xuekairui.gateway.EndToEndBusinessFlowTest.stage7_AdminReviewLicense -- Time elapsed: 0.037 s <<< FAILURE!
java.lang.AssertionError: Status expected:<200> but was:<401>
	at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:61)
	at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:128)
	at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:640)
	at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214)
	at com.xuekairui.gateway.EndToEndBusinessFlowTest.stage7_AdminReviewLicense(EndToEndBusinessFlowTest.java:264)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)

[ERROR] com.xuekairui.gateway.EndToEndBusinessFlowTest.stage8_CheckAuditLogs -- Time elapsed: 0.008 s <<< FAILURE!
java.lang.AssertionError: Status expected:<200> but was:<401>
	at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:61)
	at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:128)
	at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:640)
	at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214)
	at com.xuekairui.gateway.EndToEndBusinessFlowTest.stage8_CheckAuditLogs(EndToEndBusinessFlowTest.java:295)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)

[INFO] Running 文件上传接口测试
15:17:49.153  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.FileUploadControllerTest]: FileUploadControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:17:49.156  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.FileUploadControllerTest

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::               (v3.5.14)

15:17:49.185  INFO [] [] [        main] c.x.g.FileUploadControllerTest : Starting FileUploadControllerTest using Java 17.0.17 with PID 37656 (started by geloger in D:\project\zhijiayun-pharmacy\zhijiayun-gateway)
15:17:49.185 DEBUG [] [] [        main] c.x.g.FileUploadControllerTest : Running with Spring Boot v3.5.14, Spring v6.2.18
15:17:49.186  INFO [] [] [        main] c.x.g.FileUploadControllerTest : The following 1 profile is active: "test"
15:17:49.553  INFO [] [] [        main] epositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
15:17:49.553  INFO [] [] [        main] epositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
15:17:49.567  INFO [] [] [        main] epositoryConfigurationDelegate : Finished Spring Data repository scanning in 12 ms. Found 0 Redis repository interfaces.
 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.5.16 
15:17:49.957  INFO [] [] [        main] c.x.u.service.AliyunSmsClient  : 阿里云短信客户端初始化成功，端点: dysmsapi.aliyuncs.com
15:17:50.211  INFO [] [] [        main] c.z.hikari.HikariDataSource    : HikariPool-2 - Starting...
15:17:50.226  INFO [] [] [        main] c.z.hikari.pool.HikariPool     : HikariPool-2 - Added connection com.mysql.cj.jdbc.ConnectionImpl@31e8949d
15:17:50.226  INFO [] [] [        main] c.z.hikari.HikariDataSource    : HikariPool-2 - Start completed.
[DB-INIT] Test database initialized successfully
15:17:51.475  INFO [] [] [        main] .b.a.e.w.EndpointLinksResolver : Exposing 1 endpoint beneath base path '/actuator'
15:17:51.484  WARN [] [] [        main] etailsServiceAutoConfiguration : 

Using generated security password: c6536c9b-8164-4a99-b1f7-1b03cfb2ee55

This generated password is for development use only. Your security configuration must be updated before running your application in production.

15:17:51.485  INFO [] [] [        main] zeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager
15:17:51.535  INFO [] [] [        main] tisPlusApplicationContextAware : Register ApplicationContext instances org.springframework.web.context.support.GenericWebApplicationContext@6288199
15:17:51.577 DEBUG [] [] [        main] c.x.g.f.RequestLoggingFilter   : Filter 'requestLoggingFilter' configured for use
15:17:51.577 DEBUG [] [] [        main] c.x.g.filter.RateLimitFilter   : Filter 'rateLimitFilter' configured for use
15:17:51.577 DEBUG [] [] [        main] .x.u.s.JwtAuthenticationFilter : Filter 'jwtAuthenticationFilter' configured for use
15:17:51.577  INFO [] [] [        main] w.SpringBootMockServletContext : Initializing Spring TestDispatcherServlet ''
15:17:51.577  INFO [] [] [        main] .s.t.w.s.TestDispatcherServlet : Initializing Servlet ''
15:17:51.577  INFO [] [] [        main] .s.t.w.s.TestDispatcherServlet : Completed initialization in 0 ms
15:17:51.626  INFO [] [] [        main] c.x.g.FileUploadControllerTest : Started FileUploadControllerTest in 2.465 seconds (process running for 50.372)
15:17:51.629 DEBUG [C4jWrYkF] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==>  Preparing: SELECT * FROM t_payment_order WHERE status = 'PENDING' AND expire_time < ?
15:17:51.630 DEBUG [] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (role = ?) LIMIT 1
15:17:51.630 DEBUG [C4jWrYkF] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==> Parameters: 2026-07-02T15:17:51.629687600(LocalDateTime)
15:17:51.630 DEBUG [] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: SUPER_ADMIN(String)
15:17:51.632 DEBUG [] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 0
15:17:51.633 DEBUG [] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (nickname = ?)
15:17:51.633 DEBUG [] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: admin(String)
15:17:51.633 DEBUG [C4jWrYkF] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : <==      Total: 0
15:17:51.635 DEBUG [] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 0
15:17:51.687 DEBUG [] [] [        main] c.x.u.m.UserMapper.insert      : ==>  Preparing: INSERT INTO t_user ( id, nickname, password, status, role, token_version, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )
15:17:51.687 DEBUG [] [] [        main] c.x.u.m.UserMapper.insert      : ==> Parameters: 2072580496406028290(Long), admin(String), $2a$10$yPk9rdR/zrI0I/ud9iBbfOLnunqAfNgSnWyVrXbFo.GgkrKLdyALC(String), 1(Integer), SUPER_ADMIN(String), 0(Long), 2026-07-02T15:17:51.687287300(LocalDateTime), 2026-07-02T15:17:51.687287300(LocalDateTime)
15:17:51.693 DEBUG [] [] [        main] c.x.u.m.UserMapper.insert      : <==    Updates: 1
15:17:51.693  INFO [] [] [        main] c.x.u.c.SuperAdminInitializer  : 已创建默认超级管理员，用户名：admin，默认密码：admin@123，请尽快修改默认密码
15:17:54.790 DEBUG [ZvAcFqUS] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/upload | IP: 127.0.0.1
15:17:54.791 DEBUG [ZvAcFqUS] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:54.792 DEBUG [ZvAcFqUS] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:54.794 DEBUG [ZvAcFqUS] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:54.799  INFO [ZvAcFqUS] [1] [        main] c.x.u.c.FileUploadController   : 文件上传成功: C:\Users\gelog\AppData\Local\Temp\zhijiayun-test-uploads\dbe0fd8be26e428c98f39b5fa9d58ae3.jpg
15:17:54.801 DEBUG [ZvAcFqUS] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/upload 200 11ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/upload
       Parameters = {}
          Headers = [Content-Type:"multipart/form-data;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NzQsImV4cCI6MTc4MzA2MzA3NH0.M47hd8jsKV1dCZu8a-JVsyxR6hEjf0G_MP2vFaV4rd0FiUcNy7dd_znWpY_0PSWwstW8FKnDi60VpJnebrCg9g"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.FileUploadController
           Method = com.xuekairui.user.controller.FileUploadController#upload(MultipartFile)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ZvAcFqUS", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":"/opt/uploads/dbe0fd8be26e428c98f39b5fa9d58ae3.jpg","timestamp":1782976674799}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:54.807 DEBUG [thjgHf26] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/upload | IP: 127.0.0.1
15:17:54.810 DEBUG [thjgHf26] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:54.811 DEBUG [thjgHf26] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:54.812 DEBUG [thjgHf26] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:54.813 DEBUG [thjgHf26] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/upload 200 6ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/upload
       Parameters = {}
          Headers = [Content-Type:"multipart/form-data;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NzQsImV4cCI6MTc4MzA2MzA3NH0.M47hd8jsKV1dCZu8a-JVsyxR6hEjf0G_MP2vFaV4rd0FiUcNy7dd_znWpY_0PSWwstW8FKnDi60VpJnebrCg9g"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.FileUploadController
           Method = com.xuekairui.user.controller.FileUploadController#upload(MultipartFile)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"thjgHf26", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"文件不能为空","data":null,"timestamp":1782976674813}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:54.818 DEBUG [ZYAMBxnT] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/upload | IP: 127.0.0.1
15:17:54.819  WARN [ZYAMBxnT] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/upload 401 1ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/upload
       Parameters = {}
          Headers = [Content-Type:"multipart/form-data;charset=UTF-8"]
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"ZYAMBxnT", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976674819}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:54.825 DEBUG [rUC79meH] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/upload | IP: 127.0.0.1
15:17:54.826 DEBUG [rUC79meH] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:17:54.826 DEBUG [rUC79meH] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:17:54.828 DEBUG [rUC79meH] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:17:54.830  INFO [rUC79meH] [1] [        main] c.x.u.c.FileUploadController   : 文件上传成功: C:\Users\gelog\AppData\Local\Temp\zhijiayun-test-uploads\98c2777f9e064f098b1a718ac14a8a46.png
15:17:54.830 DEBUG [rUC79meH] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/upload 200 5ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/upload
       Parameters = {}
          Headers = [Content-Type:"multipart/form-data;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NzQsImV4cCI6MTc4MzA2MzA3NH0.M47hd8jsKV1dCZu8a-JVsyxR6hEjf0G_MP2vFaV4rd0FiUcNy7dd_znWpY_0PSWwstW8FKnDi60VpJnebrCg9g"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.FileUploadController
           Method = com.xuekairui.user.controller.FileUploadController#upload(MultipartFile)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"rUC79meH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":"/opt/uploads/98c2777f9e064f098b1a718ac14a8a46.png","timestamp":1782976674830}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 5.682 s -- in 文件上传接口测试
[INFO] Running 网关过滤器测试
15:17:54.835  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GatewayFilterTest]: GatewayFilterTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:17:54.837  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GatewayFilterTest
[INFO] Running 客户端IP提取
15:17:57.984  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GatewayFilterTest$ClientIpTests]: ClientIpTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:17:57.986  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GatewayFilterTest$ClientIpTests
15:17:57.994 DEBUG [7a3xWaS9] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 192.168.1.1
15:17:57.996 DEBUG [7a3xWaS9] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:57.996 DEBUG [7a3xWaS9] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:57.998 DEBUG [7a3xWaS9] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:57.999 DEBUG [7a3xWaS9] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:57.999 DEBUG [7a3xWaS9] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.001 DEBUG [7a3xWaS9] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.002 DEBUG [7a3xWaS9] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.002 DEBUG [7a3xWaS9] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.003 DEBUG [7a3xWaS9] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.005 DEBUG [7a3xWaS9] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 11ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = [X-Forwarded-For:"192.168.1.1, 10.0.0.1, 172.16.0.1"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"7a3xWaS9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678003}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.011 DEBUG [2DnDVeMg] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 10.0.0.1
15:17:58.013 DEBUG [2DnDVeMg] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.013 DEBUG [2DnDVeMg] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.015 DEBUG [2DnDVeMg] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.016 DEBUG [2DnDVeMg] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.016 DEBUG [2DnDVeMg] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.018 DEBUG [2DnDVeMg] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.018 DEBUG [2DnDVeMg] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.018 DEBUG [2DnDVeMg] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.021 DEBUG [2DnDVeMg] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.023 DEBUG [2DnDVeMg] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 12ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = [X-Real-IP:"10.0.0.1"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"2DnDVeMg", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678021}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.029 DEBUG [Bgk8sF7K] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 192.168.1.100
15:17:58.030 DEBUG [Bgk8sF7K] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.030 DEBUG [Bgk8sF7K] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.032 DEBUG [Bgk8sF7K] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.033 DEBUG [Bgk8sF7K] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.033 DEBUG [Bgk8sF7K] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.035 DEBUG [Bgk8sF7K] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.035 DEBUG [Bgk8sF7K] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.036 DEBUG [Bgk8sF7K] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.037 DEBUG [Bgk8sF7K] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.038 DEBUG [Bgk8sF7K] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = [X-Forwarded-For:"192.168.1.100"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Bgk8sF7K", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678037}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.059 s -- in 客户端IP提取
[INFO] Running 统一响应格式
15:17:58.043  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GatewayFilterTest$ResponseFormatTests]: ResponseFormatTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:17:58.046  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GatewayFilterTest$ResponseFormatTests
15:17:58.053 DEBUG [xa3kUkhJ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.054 DEBUG [xa3kUkhJ] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.055 DEBUG [xa3kUkhJ] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.056 DEBUG [xa3kUkhJ] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.057 DEBUG [xa3kUkhJ] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.058 DEBUG [xa3kUkhJ] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.059 DEBUG [xa3kUkhJ] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.060 DEBUG [xa3kUkhJ] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.060 DEBUG [xa3kUkhJ] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.061 DEBUG [xa3kUkhJ] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.062 DEBUG [xa3kUkhJ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"xa3kUkhJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678061}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.068 DEBUG [hdN9Z4K6] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:58.069  WARN [hdN9Z4K6] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"hdN9Z4K6", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976678068}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.075 DEBUG [7RYf83cy] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/nonexistent | IP: 127.0.0.1
15:17:58.077  WARN [7RYf83cy] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/nonexistent 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/nonexistent
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"7RYf83cy", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976678077}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.038 s -- in 统一响应格式
[INFO] Running 限流过滤器
15:17:58.081  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GatewayFilterTest$RateLimitTests]: RateLimitTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:17:58.084  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GatewayFilterTest$RateLimitTests
15:17:58.091 DEBUG [Uv2EkXtw] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:58.092  WARN [Uv2EkXtw] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"Uv2EkXtw", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976678092}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.099 DEBUG [p3ygLaJb] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.100 DEBUG [p3ygLaJb] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.100 DEBUG [p3ygLaJb] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.102 DEBUG [p3ygLaJb] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.102 DEBUG [p3ygLaJb] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.103 DEBUG [p3ygLaJb] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.105 DEBUG [p3ygLaJb] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.106 DEBUG [p3ygLaJb] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.106 DEBUG [p3ygLaJb] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.108 DEBUG [p3ygLaJb] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.108 DEBUG [p3ygLaJb] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"p3ygLaJb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678108}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.110 DEBUG [zW4VLH36] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.111 DEBUG [zW4VLH36] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.111 DEBUG [zW4VLH36] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.113 DEBUG [zW4VLH36] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.114 DEBUG [zW4VLH36] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.114 DEBUG [zW4VLH36] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.115 DEBUG [zW4VLH36] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.116 DEBUG [zW4VLH36] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.116 DEBUG [zW4VLH36] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.118 DEBUG [zW4VLH36] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.119 DEBUG [zW4VLH36] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"zW4VLH36", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678118}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.120 DEBUG [yruUE7xc] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.121 DEBUG [yruUE7xc] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.121 DEBUG [yruUE7xc] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.123 DEBUG [yruUE7xc] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.124 DEBUG [yruUE7xc] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.124 DEBUG [yruUE7xc] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.125 DEBUG [yruUE7xc] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.126 DEBUG [yruUE7xc] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.126 DEBUG [yruUE7xc] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.128 DEBUG [yruUE7xc] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.129 DEBUG [yruUE7xc] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 8ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"yruUE7xc", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678128}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.129 DEBUG [Pscp8ufJ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.130 DEBUG [Pscp8ufJ] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.130 DEBUG [Pscp8ufJ] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.132 DEBUG [Pscp8ufJ] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.133 DEBUG [Pscp8ufJ] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.133 DEBUG [Pscp8ufJ] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.135 DEBUG [Pscp8ufJ] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.136 DEBUG [Pscp8ufJ] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.136 DEBUG [Pscp8ufJ] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.137 DEBUG [Pscp8ufJ] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.138 DEBUG [Pscp8ufJ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Pscp8ufJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678138}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.139 DEBUG [BBSJP5qq] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.140 DEBUG [BBSJP5qq] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.140 DEBUG [BBSJP5qq] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.142 DEBUG [BBSJP5qq] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.143 DEBUG [BBSJP5qq] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.143 DEBUG [BBSJP5qq] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.145 DEBUG [BBSJP5qq] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.145 DEBUG [BBSJP5qq] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.145 DEBUG [BBSJP5qq] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.148 DEBUG [BBSJP5qq] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.149 DEBUG [BBSJP5qq] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 10ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"BBSJP5qq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678148}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.149 DEBUG [JdF4V9mk] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.150 DEBUG [JdF4V9mk] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.150 DEBUG [JdF4V9mk] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.152 DEBUG [JdF4V9mk] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.153 DEBUG [JdF4V9mk] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.153 DEBUG [JdF4V9mk] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.155 DEBUG [JdF4V9mk] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.156 DEBUG [JdF4V9mk] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.156 DEBUG [JdF4V9mk] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.158 DEBUG [JdF4V9mk] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.158 DEBUG [JdF4V9mk] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"JdF4V9mk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678158}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.159 DEBUG [pJsDHaRC] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.160 DEBUG [pJsDHaRC] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.160 DEBUG [pJsDHaRC] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.162 DEBUG [pJsDHaRC] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.163 DEBUG [pJsDHaRC] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.163 DEBUG [pJsDHaRC] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.165 DEBUG [pJsDHaRC] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.166 DEBUG [pJsDHaRC] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.166 DEBUG [pJsDHaRC] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.168 DEBUG [pJsDHaRC] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.169 DEBUG [pJsDHaRC] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 10ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"pJsDHaRC", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678168}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.170 DEBUG [3hLe6hnB] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.171 DEBUG [3hLe6hnB] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.171 DEBUG [3hLe6hnB] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.173 DEBUG [3hLe6hnB] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.174 DEBUG [3hLe6hnB] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.174 DEBUG [3hLe6hnB] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.176 DEBUG [3hLe6hnB] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.177 DEBUG [3hLe6hnB] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.177 DEBUG [3hLe6hnB] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.179 DEBUG [3hLe6hnB] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.180 DEBUG [3hLe6hnB] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 10ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"3hLe6hnB", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678179}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.180 DEBUG [ffkk5bQG] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.181 DEBUG [ffkk5bQG] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.181 DEBUG [ffkk5bQG] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.183 DEBUG [ffkk5bQG] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.184 DEBUG [ffkk5bQG] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.184 DEBUG [ffkk5bQG] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.185 DEBUG [ffkk5bQG] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.186 DEBUG [ffkk5bQG] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.186 DEBUG [ffkk5bQG] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.188 DEBUG [ffkk5bQG] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.189 DEBUG [ffkk5bQG] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ffkk5bQG", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678188}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.189 DEBUG [MYWZMV3q] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.192 DEBUG [MYWZMV3q] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.192 DEBUG [MYWZMV3q] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.193 DEBUG [MYWZMV3q] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.194 DEBUG [MYWZMV3q] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.194 DEBUG [MYWZMV3q] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.196 DEBUG [MYWZMV3q] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.196 DEBUG [MYWZMV3q] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.196 DEBUG [MYWZMV3q] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.199 DEBUG [MYWZMV3q] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.199 DEBUG [MYWZMV3q] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 10ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"MYWZMV3q", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678199}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.206 DEBUG [nhTNb26q] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.208 DEBUG [nhTNb26q] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.208 DEBUG [nhTNb26q] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.209 DEBUG [nhTNb26q] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.211 DEBUG [nhTNb26q] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.211 DEBUG [nhTNb26q] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.213 DEBUG [nhTNb26q] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.213 DEBUG [nhTNb26q] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.214 DEBUG [nhTNb26q] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.215 DEBUG [nhTNb26q] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.216 DEBUG [nhTNb26q] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 10ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"nhTNb26q", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678215}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.223 DEBUG [jZUeVZ8b] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.224 DEBUG [jZUeVZ8b] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.224 DEBUG [jZUeVZ8b] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.226 DEBUG [jZUeVZ8b] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.227 DEBUG [jZUeVZ8b] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.227 DEBUG [jZUeVZ8b] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.229 DEBUG [jZUeVZ8b] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.229 DEBUG [jZUeVZ8b] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.229 DEBUG [jZUeVZ8b] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.231 DEBUG [jZUeVZ8b] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.232 DEBUG [jZUeVZ8b] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"jZUeVZ8b", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678231}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.239 DEBUG [JabjFpFd] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.241 DEBUG [JabjFpFd] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.241 DEBUG [JabjFpFd] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.244 DEBUG [JabjFpFd] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.244 DEBUG [JabjFpFd] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.244 DEBUG [JabjFpFd] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.247 DEBUG [JabjFpFd] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.248 DEBUG [JabjFpFd] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.248 DEBUG [JabjFpFd] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.250 DEBUG [JabjFpFd] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.251 DEBUG [JabjFpFd] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 12ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"JabjFpFd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678250}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.262 DEBUG [3N8ff9CB] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.264 DEBUG [3N8ff9CB] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.265 DEBUG [3N8ff9CB] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.267 DEBUG [3N8ff9CB] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.268 DEBUG [3N8ff9CB] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.268 DEBUG [3N8ff9CB] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.270 DEBUG [3N8ff9CB] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.271 DEBUG [3N8ff9CB] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.271 DEBUG [3N8ff9CB] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.274 DEBUG [3N8ff9CB] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.275 DEBUG [3N8ff9CB] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 13ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"3N8ff9CB", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678274}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.198 s -- in 限流过滤器
[INFO] Running 请求日志过滤器
15:17:58.280  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GatewayFilterTest$RequestLoggingTests]: RequestLoggingTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:17:58.283  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GatewayFilterTest$RequestLoggingTests
15:17:58.293 DEBUG [fxBgz3Kt] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.296 DEBUG [fxBgz3Kt] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.296 DEBUG [fxBgz3Kt] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.299 DEBUG [fxBgz3Kt] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.300 DEBUG [fxBgz3Kt] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.300 DEBUG [fxBgz3Kt] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.302 DEBUG [fxBgz3Kt] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.303 DEBUG [fxBgz3Kt] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.303 DEBUG [fxBgz3Kt] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.306 DEBUG [fxBgz3Kt] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.306 DEBUG [fxBgz3Kt] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 13ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"fxBgz3Kt", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678306}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.316 DEBUG [UR33DKbL] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send | IP: 127.0.0.1
15:17:58.317  INFO [UR33DKbL] [] [        main] .x.u.s.VerificationCodeService : 【验证码-测试模式】是否启用 true
15:17:58.320  INFO [UR33DKbL] [] [        main] .x.u.s.VerificationCodeService : 【验证码-测试模式】手机号: 138****8000, 验证码: 123456 (固定), 场景: login, 有效期: 5分钟
15:17:58.321 DEBUG [UR33DKbL] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send 200 5ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/send
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","scene":"login"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"UR33DKbL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976678320}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.328 DEBUG [vASvXfKM] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.329 DEBUG [vASvXfKM] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.331 DEBUG [vASvXfKM] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.334 DEBUG [vASvXfKM] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.335 DEBUG [vASvXfKM] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.336 DEBUG [vASvXfKM] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.338 DEBUG [vASvXfKM] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.338 DEBUG [vASvXfKM] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.338 DEBUG [vASvXfKM] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.341 DEBUG [vASvXfKM] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.342 DEBUG [vASvXfKM] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 14ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"vASvXfKM", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678341}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.343 DEBUG [zbu5FgQG] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.345 DEBUG [zbu5FgQG] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.345 DEBUG [zbu5FgQG] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.348 DEBUG [zbu5FgQG] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.349 DEBUG [zbu5FgQG] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.349 DEBUG [zbu5FgQG] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.352 DEBUG [zbu5FgQG] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.353 DEBUG [zbu5FgQG] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.353 DEBUG [zbu5FgQG] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.356 DEBUG [zbu5FgQG] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.357 DEBUG [zbu5FgQG] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 14ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"zbu5FgQG", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678356}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.377 DEBUG [my-custom-id-123] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:17:58.379 DEBUG [my-custom-id-123] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.379 DEBUG [my-custom-id-123] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:17:58.381 DEBUG [my-custom-id-123] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:17:58.382 DEBUG [my-custom-id-123] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.382 DEBUG [my-custom-id-123] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:17:58.384 DEBUG [my-custom-id-123] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.385 DEBUG [my-custom-id-123] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:17:58.385 DEBUG [my-custom-id-123] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:17:58.387 DEBUG [my-custom-id-123] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:17:58.388 DEBUG [my-custom-id-123] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 11ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = [X-Request-Id:"my-custom-id-123"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"my-custom-id-123", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976678387}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:17:58.395 DEBUG [aZsjEREt] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:17:58.396  WARN [aZsjEREt] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"aZsjEREt", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976678395}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.121 s -- in 请求日志过滤器
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.565 s -- in 网关过滤器测试
[INFO] Running 全局异常处理测试
15:17:58.403  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GlobalExceptionHandlerTest]: GlobalExceptionHandlerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:17:58.410  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GlobalExceptionHandlerTest
[INFO] Running 边界场景
15:18:01.631  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GlobalExceptionHandlerTest$EdgeCases]: EdgeCases does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:01.633  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GlobalExceptionHandlerTest$EdgeCases
15:18:01.636 DEBUG [82LJjFHK] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:18:01.637 DEBUG [82LJjFHK] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.637 DEBUG [82LJjFHK] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:01.639 DEBUG [82LJjFHK] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:01.640 DEBUG [82LJjFHK] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.640 DEBUG [82LJjFHK] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:18:01.641 DEBUG [82LJjFHK] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:01.642 DEBUG [82LJjFHK] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.642 DEBUG [82LJjFHK] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:18:01.643 DEBUG [82LJjFHK] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:01.643 DEBUG [82LJjFHK] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 7ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"82LJjFHK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976681643}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:01.644 DEBUG [a7ZFHHPP] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:18:01.644 DEBUG [a7ZFHHPP] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.644 DEBUG [a7ZFHHPP] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:01.646 DEBUG [a7ZFHHPP] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:01.647 DEBUG [a7ZFHHPP] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.647 DEBUG [a7ZFHHPP] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:18:01.648 DEBUG [a7ZFHHPP] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:01.649 DEBUG [a7ZFHHPP] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.649 DEBUG [a7ZFHHPP] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:18:01.650 DEBUG [a7ZFHHPP] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:01.652 DEBUG [a7ZFHHPP] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 8ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"a7ZFHHPP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976681651}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:01.652 DEBUG [eBQZCayY] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:18:01.652 DEBUG [eBQZCayY] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.653 DEBUG [eBQZCayY] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:01.655 DEBUG [eBQZCayY] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:01.655 DEBUG [eBQZCayY] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.655 DEBUG [eBQZCayY] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:18:01.657 DEBUG [eBQZCayY] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:01.657 DEBUG [eBQZCayY] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.657 DEBUG [eBQZCayY] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:18:01.659 DEBUG [eBQZCayY] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:01.660 DEBUG [eBQZCayY] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 8ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"eBQZCayY", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976681659}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:01.660 DEBUG [GLPKjQMh] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:18:01.661 DEBUG [GLPKjQMh] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.661 DEBUG [GLPKjQMh] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:01.663 DEBUG [GLPKjQMh] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:01.663 DEBUG [GLPKjQMh] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.663 DEBUG [GLPKjQMh] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:18:01.665 DEBUG [GLPKjQMh] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:01.666 DEBUG [GLPKjQMh] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.666 DEBUG [GLPKjQMh] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:18:01.668 DEBUG [GLPKjQMh] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:01.668 DEBUG [GLPKjQMh] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 8ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"GLPKjQMh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976681668}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:01.669 DEBUG [Z7q9PwEe] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:18:01.670 DEBUG [Z7q9PwEe] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.670 DEBUG [Z7q9PwEe] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:01.672 DEBUG [Z7q9PwEe] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:01.672 DEBUG [Z7q9PwEe] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.673 DEBUG [Z7q9PwEe] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:18:01.674 DEBUG [Z7q9PwEe] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:01.675 DEBUG [Z7q9PwEe] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.675 DEBUG [Z7q9PwEe] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:18:01.677 DEBUG [Z7q9PwEe] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:01.677 DEBUG [Z7q9PwEe] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 8ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Z7q9PwEe", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976681677}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:01.680 DEBUG [s8aKUJf7] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TEST%2520CODE | IP: 127.0.0.1
15:18:01.682  WARN [s8aKUJf7] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TEST%2520CODE 400 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/page/TEST%2520CODE
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"s8aKUJf7"]
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:01.686 DEBUG [UWStuhxT] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | IP: 127.0.0.1
15:18:01.688 DEBUG [UWStuhxT] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
15:18:01.688 DEBUG [UWStuhxT] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA(String)
15:18:01.691 DEBUG [UWStuhxT] [] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:01.692  WARN [UWStuhxT] [] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=3001, message=邀请码无效
15:18:01.692 DEBUG [UWStuhxT] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 200 6ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/page/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"UWStuhxT", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976681692}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.064 s -- in 边界场景
[INFO] Running 统一响应格式
15:18:01.696  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GlobalExceptionHandlerTest$ResponseFormat]: ResponseFormat does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:01.698  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GlobalExceptionHandlerTest$ResponseFormat
15:18:01.702 DEBUG [gB2Dcbsq] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:18:01.702 DEBUG [gB2Dcbsq] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.703 DEBUG [gB2Dcbsq] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:01.705 DEBUG [gB2Dcbsq] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:01.706 DEBUG [gB2Dcbsq] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.706 DEBUG [gB2Dcbsq] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:18:01.708 DEBUG [gB2Dcbsq] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:01.709 DEBUG [gB2Dcbsq] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.709 DEBUG [gB2Dcbsq] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:18:01.711 DEBUG [gB2Dcbsq] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:01.712 DEBUG [gB2Dcbsq] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 10ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"gB2Dcbsq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976681711}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:01.717 DEBUG [Q7mNc7h5] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send | IP: 127.0.0.1
15:18:01.718  WARN [Q7mNc7h5] [] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 手机号格式不正确, 场景不能为空
15:18:01.719  WARN [Q7mNc7h5] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send 400 2ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/send
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"13"]
             Body = {"phone":"1"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"Q7mNc7h5", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"手机号格式不正确, 场景不能为空","data":null,"timestamp":1782976681718}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:01.723 DEBUG [K3bgRYWJ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:18:01.725 DEBUG [K3bgRYWJ] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.725 DEBUG [K3bgRYWJ] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:01.726 DEBUG [K3bgRYWJ] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:01.728 DEBUG [K3bgRYWJ] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.728 DEBUG [K3bgRYWJ] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:18:01.729 DEBUG [K3bgRYWJ] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:01.730 DEBUG [K3bgRYWJ] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.730 DEBUG [K3bgRYWJ] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:18:01.732 DEBUG [K3bgRYWJ] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:01.733 DEBUG [K3bgRYWJ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 10ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"K3bgRYWJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976681732}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:01.738 DEBUG [vu3EJJLj] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:18:01.740 DEBUG [vu3EJJLj] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.740 DEBUG [vu3EJJLj] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:01.741 DEBUG [vu3EJJLj] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:01.743 DEBUG [vu3EJJLj] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.743 DEBUG [vu3EJJLj] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:18:01.745 DEBUG [vu3EJJLj] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:01.745 DEBUG [vu3EJJLj] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:01.746 DEBUG [vu3EJJLj] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:18:01.748 DEBUG [vu3EJJLj] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:01.749 DEBUG [vu3EJJLj] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 11ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"vu3EJJLj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976681748}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.056 s -- in 统一响应格式
[INFO] Running 认证异常 (401)
15:18:01.754  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GlobalExceptionHandlerTest$AuthenticationExceptions]: AuthenticationExceptions does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:01.756  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GlobalExceptionHandlerTest$AuthenticationExceptions
15:18:01.760 DEBUG [jQ7YSutZ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:18:01.761  WARN [jQ7YSutZ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"jQ7YSutZ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976681761}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:01.767 DEBUG [jGEGfMWX] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:18:01.768  WARN [jGEGfMWX] [] [        main] c.xuekairui.user.util.JwtUtil  : JWT解析TokenLenient失败, 原因: Malformed protected header JSON: Unable to deserialize: Unrecognized token 'i': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
 at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 1]
15:18:01.768  WARN [jGEGfMWX] [] [        main] c.xuekairui.user.util.JwtUtil  : JWT解析Token失败, 原因: Malformed protected header JSON: Unable to deserialize: Unrecognized token 'i': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
 at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 1]
15:18:01.768  WARN [jGEGfMWX] [] [        main] .x.u.s.JwtAuthenticationFilter : JWT认证失败: Token无效
15:18:01.769  WARN [jGEGfMWX] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = [Authorization:"Bearer abc.def.ghi"]
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"jGEGfMWX", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976681769}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:01.775 DEBUG [BxNrnwCr] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:18:01.777  WARN [BxNrnwCr] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"BxNrnwCr", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976681776}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:01.781 DEBUG [DJRDjV5m] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:18:01.783  WARN [DJRDjV5m] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = [Authorization:"Basic dXNlcjpwYXNz"]
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"DJRDjV5m", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976681782}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.033 s -- in 认证异常 (401)
[INFO] Running 参数校验异常 (400)
15:18:01.787  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GlobalExceptionHandlerTest$ValidationExceptions]: ValidationExceptions does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:01.790  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GlobalExceptionHandlerTest$ValidationExceptions
15:18:01.797 DEBUG [xa6UhSuN] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:18:01.798 DEBUG [xa6UhSuN] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:01.798 DEBUG [xa6UhSuN] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:01.800 DEBUG [xa6UhSuN] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:01.801  WARN [xa6UhSuN] [1] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 消耗次数至少为1
15:18:01.803  WARN [xa6UhSuN] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 400 6ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODEsImV4cCI6MTc4MzA2MzA4MX0.p0KvkGgRxGVtNrnhB_xgvB9NCZFBiuPuWl_POrChFlndlMFMbZLYrs_Zvqcm4pRQrnKd2ZJ0FvE7fJTv1VMlMA", Content-Length:"12"]
             Body = {"count":-5}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"xa6UhSuN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"消耗次数至少为1","data":null,"timestamp":1782976681802}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:01.807 DEBUG [4CsxYX99] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send | IP: 127.0.0.1
15:18:01.810  WARN [4CsxYX99] [] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 手机号格式不正确, 场景不能为空
15:18:01.811  WARN [4CsxYX99] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send 400 4ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/send
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"15"]
             Body = {"phone":"123"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"4CsxYX99", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"手机号格式不正确, 场景不能为空","data":null,"timestamp":1782976681810}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:01.818 DEBUG [RrFDkwJ5] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:18:01.819 DEBUG [RrFDkwJ5] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:01.819 DEBUG [RrFDkwJ5] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:01.822 DEBUG [RrFDkwJ5] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:01.824 ERROR [RrFDkwJ5] [1] [        main] c.x.h.GlobalExceptionHandler   : 系统异常

org.springframework.web.HttpMediaTypeNotSupportedException: Content-Type 'text/plain;charset=UTF-8' is not supported
	at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:236)
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:176)
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:150)
	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)
	at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:227)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:181)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
	at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:165)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
	at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
	at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:490)
	at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:351)
	at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:83)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:129)
	at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:101)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:125)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at com.xuekairui.user.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:143)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
	at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:334)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:225)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:52)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
	at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebSecurityConfiguration.java:319)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$4(HandlerMappingIntrospector.java:267)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
	at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:240)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at com.xuekairui.gateway.filter.RateLimitFilter.doFilterInternal(RateLimitFilter.java:56)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at com.xuekairui.gateway.filter.RequestLoggingFilter.doFilterInternal(RequestLoggingFilter.java:79)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:201)
	at com.xuekairui.gateway.GlobalExceptionHandlerTest$ValidationExceptions.wrongContentType_shouldReturnError(GlobalExceptionHandlerTest.java:70)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:775)
	at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:479)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:216)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:212)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85)
	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
	at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)
	at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
	at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)
	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
	at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithoutCancellationToken(LauncherAdapter.java:60)
	at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:52)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
	at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
	at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)

15:18:01.829  WARN [RrFDkwJ5] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 500 11ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"text/plain;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODEsImV4cCI6MTc4MzA2MzA4MX0.p0KvkGgRxGVtNrnhB_xgvB9NCZFBiuPuWl_POrChFlndlMFMbZLYrs_Zvqcm4pRQrnKd2ZJ0FvE7fJTv1VMlMA", Content-Length:"8"]
             Body = not json
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.HttpMediaTypeNotSupportedException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 500
    Error message = null
          Headers = [X-Request-Id:"RrFDkwJ5", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":500,"message":"系统繁忙，请稍后重试","data":null,"timestamp":1782976681827}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:01.836 DEBUG [qMHSGzTE] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:18:01.837 DEBUG [qMHSGzTE] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:01.837 DEBUG [qMHSGzTE] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:01.839 DEBUG [qMHSGzTE] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:01.841  WARN [qMHSGzTE] [1] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 消耗次数至少为1
15:18:01.841  WARN [qMHSGzTE] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 400 5ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODEsImV4cCI6MTc4MzA2MzA4MX0.p0KvkGgRxGVtNrnhB_xgvB9NCZFBiuPuWl_POrChFlndlMFMbZLYrs_Zvqcm4pRQrnKd2ZJ0FvE7fJTv1VMlMA", Content-Length:"11"]
             Body = {"count":0}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"qMHSGzTE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"消耗次数至少为1","data":null,"timestamp":1782976681841}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:01.845 DEBUG [6zhpy9Xw] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send | IP: 127.0.0.1
15:18:01.847  WARN [6zhpy9Xw] [] [        main] c.x.h.GlobalExceptionHandler   : 请求体解析失败: JSON parse error: Unexpected character ('n' (code 110)): was expecting double-quote to start field name
15:18:01.847  WARN [6zhpy9Xw] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send 400 2ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/send
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"16"]
             Body = {not valid json}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.http.converter.HttpMessageNotReadableException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"6zhpy9Xw", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"请求体格式错误","data":null,"timestamp":1782976681847}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.064 s -- in 参数校验异常 (400)
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.450 s -- in 全局异常处理测试
[INFO] Running 邀请系统接口测试
15:18:01.853  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.InviteControllerTest]: InviteControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:01.855  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.InviteControllerTest
15:18:04.878 DEBUG [t8jxGE82] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/code | IP: 127.0.0.1
15:18:04.879 DEBUG [t8jxGE82] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:04.879 DEBUG [t8jxGE82] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:04.881 DEBUG [t8jxGE82] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:04.882 DEBUG [t8jxGE82] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
15:18:04.882 DEBUG [t8jxGE82] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:04.882059(LocalDateTime)
15:18:04.884 DEBUG [t8jxGE82] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:04.884 DEBUG [t8jxGE82] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:18:04.884 DEBUG [t8jxGE82] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:18:04.886 DEBUG [t8jxGE82] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:04.886 DEBUG [t8jxGE82] [1] [        main] c.x.i.m.I.selectCount          : ==>  Preparing: SELECT COUNT( * ) AS total FROM t_invite_code WHERE (code = ?)
15:18:04.886 DEBUG [t8jxGE82] [1] [        main] c.x.i.m.I.selectCount          : ==> Parameters: 4FQ2CNX5(String)
15:18:04.888 DEBUG [t8jxGE82] [1] [        main] c.x.i.m.I.selectCount          : <==      Total: 1
15:18:04.888 DEBUG [t8jxGE82] [1] [        main] c.x.i.m.I.insert               : ==>  Preparing: INSERT INTO t_invite_code ( user_id, code, max_uses, used_count, click_count, expire_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:04.888 DEBUG [t8jxGE82] [1] [        main] c.x.i.m.I.insert               : ==> Parameters: 1(Long), 4FQ2CNX5(String), -1(Integer), 0(Integer), 0(Integer), 2026-08-01T15:18:04.886075800(LocalDateTime), 1(Integer), 2026-07-02T15:18:04.888180200(LocalDateTime), 2026-07-02T15:18:04.888180200(LocalDateTime)
15:18:04.892 DEBUG [t8jxGE82] [1] [        main] c.x.i.m.I.insert               : <==    Updates: 1
15:18:04.892  INFO [t8jxGE82] [1] [        main] c.x.i.service.InviteService    : 用户 1 创建邀请码: 4FQ2CNX5
15:18:04.892 DEBUG [t8jxGE82] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:18:04.892 DEBUG [t8jxGE82] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:18:04.894 DEBUG [t8jxGE82] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:04.895 DEBUG [t8jxGE82] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:04.895 DEBUG [t8jxGE82] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:04.896 DEBUG [t8jxGE82] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:04.897 DEBUG [t8jxGE82] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/code 200 19ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/code
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODQsImV4cCI6MTc4MzA2MzA4NH0.UoNUJvmECX360VZbzQZHGXAHLlb1grDL6PCdNkNIWP9nO3l633zQFfKu1da7wRsQtH4U5Hw9plJaUCKb_iCStw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"t8jxGE82", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"code":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","inviterNickname":"测试用户","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:18:04","status":1,"createTime":"2026-07-02 15:18:04","shareTitle":"测试用户 邀请你加入智价云（药店版）","shareDescription":"登录智价云（药店版），邀请好友各得好礼","copyText":"我是测试用户，在这里发现了一个药店采购神器——智价云（药店版）！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/4FQ2CNX5填我的邀请码 4FQ2CNX5 完成注册，你也会获得会员权益！","rewardDescription":"邀请人每成功邀请1家药店注册，赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/4FQ2CNX5"},"timestamp":1782976684896}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:04.900 DEBUG [DXtQgWnK] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/code | IP: 127.0.0.1
15:18:04.902  WARN [DXtQgWnK] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/code 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/code
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"DXtQgWnK", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976684901}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:04.907 DEBUG [ms7qEhtr] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/code | IP: 127.0.0.1
15:18:04.908 DEBUG [ms7qEhtr] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:04.908 DEBUG [ms7qEhtr] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:04.910 DEBUG [ms7qEhtr] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:04.911 DEBUG [ms7qEhtr] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
15:18:04.911 DEBUG [ms7qEhtr] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:04.910778700(LocalDateTime)
15:18:04.913 DEBUG [ms7qEhtr] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:04.913 DEBUG [ms7qEhtr] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:18:04.913 DEBUG [ms7qEhtr] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:18:04.915 DEBUG [ms7qEhtr] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:04.915 DEBUG [ms7qEhtr] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:04.915 DEBUG [ms7qEhtr] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:04.917 DEBUG [ms7qEhtr] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:04.917 DEBUG [ms7qEhtr] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/code 200 10ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/code
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODQsImV4cCI6MTc4MzA2MzA4NH0.UoNUJvmECX360VZbzQZHGXAHLlb1grDL6PCdNkNIWP9nO3l633zQFfKu1da7wRsQtH4U5Hw9plJaUCKb_iCStw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ms7qEhtr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"code":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","inviterNickname":"测试用户","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:18:05","status":1,"createTime":"2026-07-02 15:18:05","shareTitle":"测试用户 邀请你加入智价云（药店版）","shareDescription":"登录智价云（药店版），邀请好友各得好礼","copyText":"我是测试用户，在这里发现了一个药店采购神器——智价云（药店版）！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/4FQ2CNX5填我的邀请码 4FQ2CNX5 完成注册，你也会获得会员权益！","rewardDescription":"邀请人每成功邀请1家药店注册，赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/4FQ2CNX5"},"timestamp":1782976684917}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:04.918 DEBUG [vFjG7xL6] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/code | IP: 127.0.0.1
15:18:04.919 DEBUG [vFjG7xL6] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
15:18:04.919 DEBUG [vFjG7xL6] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:04.919419900(LocalDateTime)
15:18:04.922 DEBUG [vFjG7xL6] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:04.922 DEBUG [vFjG7xL6] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:18:04.922 DEBUG [vFjG7xL6] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:18:04.923 DEBUG [vFjG7xL6] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:04.923 DEBUG [vFjG7xL6] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:04.923 DEBUG [vFjG7xL6] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:04.924 DEBUG [vFjG7xL6] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:04.925 DEBUG [vFjG7xL6] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/code 200 7ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/code
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODQsImV4cCI6MTc4MzA2MzA4NH0.UoNUJvmECX360VZbzQZHGXAHLlb1grDL6PCdNkNIWP9nO3l633zQFfKu1da7wRsQtH4U5Hw9plJaUCKb_iCStw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"vFjG7xL6", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"code":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","inviterNickname":"测试用户","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:18:05","status":1,"createTime":"2026-07-02 15:18:05","shareTitle":"测试用户 邀请你加入智价云（药店版）","shareDescription":"登录智价云（药店版），邀请好友各得好礼","copyText":"我是测试用户，在这里发现了一个药店采购神器——智价云（药店版）！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/4FQ2CNX5填我的邀请码 4FQ2CNX5 完成注册，你也会获得会员权益！","rewardDescription":"邀请人每成功邀请1家药店注册，赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/4FQ2CNX5"},"timestamp":1782976684925}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:04.932 DEBUG [aHfVySED] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/stats | IP: 127.0.0.1
15:18:04.933 DEBUG [aHfVySED] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:04.933 DEBUG [aHfVySED] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:04.935 DEBUG [aHfVySED] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:04.935 DEBUG [aHfVySED] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:18:04.935 DEBUG [aHfVySED] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:18:04.937 DEBUG [aHfVySED] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:04.937 DEBUG [aHfVySED] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
15:18:04.938 DEBUG [aHfVySED] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:04.937288900(LocalDateTime)
15:18:04.939 DEBUG [aHfVySED] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:04.939 DEBUG [aHfVySED] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:18:04.940 DEBUG [aHfVySED] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:18:04.941 DEBUG [aHfVySED] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:04.941 DEBUG [aHfVySED] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:04.941 DEBUG [aHfVySED] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:04.943 DEBUG [aHfVySED] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:04.943 DEBUG [aHfVySED] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
15:18:04.943 DEBUG [aHfVySED] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long)
15:18:04.945 DEBUG [aHfVySED] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:04.946 DEBUG [aHfVySED] [1] [        main] c.x.i.m.I.selectCount          : ==>  Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND create_time >= ?)
15:18:04.946 DEBUG [aHfVySED] [1] [        main] c.x.i.m.I.selectCount          : ==> Parameters: 1(Long), 2026-07-02T00:00(LocalDateTime)
15:18:04.948 DEBUG [aHfVySED] [1] [        main] c.x.i.m.I.selectCount          : <==      Total: 1
15:18:04.948 DEBUG [aHfVySED] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:04.948 DEBUG [aHfVySED] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:04.950 DEBUG [aHfVySED] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:04.950 DEBUG [aHfVySED] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:04.950 DEBUG [aHfVySED] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:04.952 DEBUG [aHfVySED] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:04.953 DEBUG [aHfVySED] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:04.953 DEBUG [aHfVySED] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:04.954 DEBUG [aHfVySED] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:04.955 DEBUG [aHfVySED] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:18:04.955 DEBUG [aHfVySED] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:18:04.957 DEBUG [aHfVySED] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:18:04.957 DEBUG [aHfVySED] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:18:04.958 DEBUG [aHfVySED] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:18:04.959 DEBUG [aHfVySED] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:18:04.960 DEBUG [aHfVySED] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:18:04.960 DEBUG [aHfVySED] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:18:04.961 DEBUG [aHfVySED] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:18:04.961 DEBUG [aHfVySED] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:18:04.961 DEBUG [aHfVySED] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:18:04.963 DEBUG [aHfVySED] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:18:04.964 DEBUG [aHfVySED] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:18:04.964 DEBUG [aHfVySED] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:18:04.965 DEBUG [aHfVySED] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:18:04.965 DEBUG [aHfVySED] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:18:04.966 DEBUG [aHfVySED] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
15:18:04.966 DEBUG [aHfVySED] [1] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:18:04.967 DEBUG [aHfVySED] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/stats 200 35ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/stats
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODQsImV4cCI6MTc4MzA2MzA4NH0.UoNUJvmECX360VZbzQZHGXAHLlb1grDL6PCdNkNIWP9nO3l633zQFfKu1da7wRsQtH4U5Hw9plJaUCKb_iCStw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getInviteStats(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"aHfVySED", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"myInviteCode":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","clickedCount":0,"totalInvited":0,"registeredCount":0,"totalReward":0,"summaryText":"已邀请0家药店，0家注册，累计获得0个月高级会员","todayInvited":0,"todayRemaining":10,"rewardPerInvite":1,"crawlerTodayRemaining":10,"crawlerQuotaFromInvites":0},"timestamp":1782976684967}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:04.973 DEBUG [aSqdxCzJ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/stats | IP: 127.0.0.1
15:18:04.974 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:04.974 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:04.977 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:04.978 DEBUG [aSqdxCzJ] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:18:04.978 DEBUG [aSqdxCzJ] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:18:04.979 DEBUG [aSqdxCzJ] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:04.980 DEBUG [aSqdxCzJ] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
15:18:04.981 DEBUG [aSqdxCzJ] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:04.980207700(LocalDateTime)
15:18:04.982 DEBUG [aSqdxCzJ] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:04.982 DEBUG [aSqdxCzJ] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:18:04.983 DEBUG [aSqdxCzJ] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:18:04.984 DEBUG [aSqdxCzJ] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:04.985 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:04.985 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:04.986 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:04.986 DEBUG [aSqdxCzJ] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
15:18:04.987 DEBUG [aSqdxCzJ] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long)
15:18:04.988 DEBUG [aSqdxCzJ] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:04.988 DEBUG [aSqdxCzJ] [1] [        main] c.x.i.m.I.selectCount          : ==>  Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND create_time >= ?)
15:18:04.988 DEBUG [aSqdxCzJ] [1] [        main] c.x.i.m.I.selectCount          : ==> Parameters: 1(Long), 2026-07-02T00:00(LocalDateTime)
15:18:04.992 DEBUG [aSqdxCzJ] [1] [        main] c.x.i.m.I.selectCount          : <==      Total: 1
15:18:04.992 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:04.992 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:04.994 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:04.994 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:04.994 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:04.996 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:04.996 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:04.997 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:04.998 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:04.998 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:18:04.998 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:18:04.999 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:18:04.999 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:18:04.999 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:18:05.001 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:18:05.001 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:18:05.001 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:18:05.002 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:18:05.003 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:18:05.003 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:18:05.004 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:18:05.004 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:18:05.004 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:18:05.006 DEBUG [aSqdxCzJ] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:18:05.006 DEBUG [aSqdxCzJ] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:18:05.006 DEBUG [aSqdxCzJ] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
15:18:05.007 DEBUG [aSqdxCzJ] [1] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:18:05.008 DEBUG [aSqdxCzJ] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/stats 200 35ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/stats
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODQsImV4cCI6MTc4MzA2MzA4NH0.UoNUJvmECX360VZbzQZHGXAHLlb1grDL6PCdNkNIWP9nO3l633zQFfKu1da7wRsQtH4U5Hw9plJaUCKb_iCStw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getInviteStats(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"aSqdxCzJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"myInviteCode":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","clickedCount":0,"totalInvited":0,"registeredCount":0,"totalReward":0,"summaryText":"已邀请0家药店，0家注册，累计获得0个月高级会员","todayInvited":0,"todayRemaining":10,"rewardPerInvite":1,"crawlerTodayRemaining":10,"crawlerQuotaFromInvites":0},"timestamp":1782976685007}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.012 DEBUG [wuvWHYfQ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/stats | IP: 127.0.0.1
15:18:05.013 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:05.013 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:05.015 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:05.015 DEBUG [wuvWHYfQ] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:18:05.015 DEBUG [wuvWHYfQ] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:18:05.016 DEBUG [wuvWHYfQ] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:05.017 DEBUG [wuvWHYfQ] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
15:18:05.017 DEBUG [wuvWHYfQ] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:05.016598900(LocalDateTime)
15:18:05.018 DEBUG [wuvWHYfQ] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:05.018 DEBUG [wuvWHYfQ] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:18:05.018 DEBUG [wuvWHYfQ] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:18:05.019 DEBUG [wuvWHYfQ] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:05.020 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:05.020 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:05.021 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:05.022 DEBUG [wuvWHYfQ] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
15:18:05.022 DEBUG [wuvWHYfQ] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long)
15:18:05.024 DEBUG [wuvWHYfQ] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:05.024 DEBUG [wuvWHYfQ] [1] [        main] c.x.i.m.I.selectCount          : ==>  Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND create_time >= ?)
15:18:05.024 DEBUG [wuvWHYfQ] [1] [        main] c.x.i.m.I.selectCount          : ==> Parameters: 1(Long), 2026-07-02T00:00(LocalDateTime)
15:18:05.025 DEBUG [wuvWHYfQ] [1] [        main] c.x.i.m.I.selectCount          : <==      Total: 1
15:18:05.026 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:05.026 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:05.027 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:05.027 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:05.027 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:05.028 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:05.029 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:05.029 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:05.031 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:05.031 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:18:05.031 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:18:05.032 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:18:05.032 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:18:05.033 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:18:05.034 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:18:05.034 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:18:05.034 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:18:05.035 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:18:05.035 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:18:05.035 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:18:05.037 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:18:05.037 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:18:05.037 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:18:05.039 DEBUG [wuvWHYfQ] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:18:05.039 DEBUG [wuvWHYfQ] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:18:05.039 DEBUG [wuvWHYfQ] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
15:18:05.040 DEBUG [wuvWHYfQ] [1] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:18:05.041 DEBUG [wuvWHYfQ] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/stats 200 29ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/stats
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODUsImV4cCI6MTc4MzA2MzA4NX0.va-tmc4WznWR0giUOlMDNexJUk-jhFTINP8WjhcxmF-yLFHRlfb59JKqyK2FBhZKG-rUiJupSUv-ohohqc9Ptg"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getInviteStats(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"wuvWHYfQ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"myInviteCode":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","clickedCount":0,"totalInvited":0,"registeredCount":0,"totalReward":0,"summaryText":"已邀请0家药店，0家注册，累计获得0个月高级会员","todayInvited":0,"todayRemaining":10,"rewardPerInvite":1,"crawlerTodayRemaining":10,"crawlerQuotaFromInvites":0},"timestamp":1782976685040}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.043 DEBUG [cFhkQmtd] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/stats | IP: 127.0.0.1
15:18:05.044  WARN [cFhkQmtd] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/stats 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/stats
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"cFhkQmtd", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976685044}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.049 DEBUG [UTU9jLeP] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/rewards | IP: 127.0.0.1
15:18:05.050 DEBUG [UTU9jLeP] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:05.051 DEBUG [UTU9jLeP] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:05.052 DEBUG [UTU9jLeP] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:05.053 DEBUG [UTU9jLeP] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?) ORDER BY create_time DESC
15:18:05.053 DEBUG [UTU9jLeP] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long)
15:18:05.055 DEBUG [UTU9jLeP] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:05.055 DEBUG [UTU9jLeP] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/rewards 200 6ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/rewards
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODUsImV4cCI6MTc4MzA2MzA4NX0.va-tmc4WznWR0giUOlMDNexJUk-jhFTINP8WjhcxmF-yLFHRlfb59JKqyK2FBhZKG-rUiJupSUv-ohohqc9Ptg"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getInviteRewards(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"UTU9jLeP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976685055}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.058 DEBUG [qzX5myJd] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/rewards | IP: 127.0.0.1
15:18:05.060  WARN [qzX5myJd] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/rewards 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/rewards
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"qzX5myJd", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976685059}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.064 DEBUG [3fdgvuUH] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/extra-quota | IP: 127.0.0.1
15:18:05.065 DEBUG [3fdgvuUH] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:05.065 DEBUG [3fdgvuUH] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:05.067 DEBUG [3fdgvuUH] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:05.068 DEBUG [3fdgvuUH] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:18:05.068 DEBUG [3fdgvuUH] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:18:05.069 DEBUG [3fdgvuUH] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:18:05.070 DEBUG [3fdgvuUH] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/extra-quota 200 6ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/extra-quota
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODUsImV4cCI6MTc4MzA2MzA4NX0.va-tmc4WznWR0giUOlMDNexJUk-jhFTINP8WjhcxmF-yLFHRlfb59JKqyK2FBhZKG-rUiJupSUv-ohohqc9Ptg"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getExtraQuota(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"3fdgvuUH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":0,"timestamp":1782976685070}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.073 DEBUG [MpSvnntL] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/extra-quota | IP: 127.0.0.1
15:18:05.075  WARN [MpSvnntL] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/extra-quota 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/extra-quota
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"MpSvnntL", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976685074}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.079 DEBUG [ejHN52Wp] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/code | IP: 127.0.0.1
15:18:05.080 DEBUG [ejHN52Wp] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:05.080 DEBUG [ejHN52Wp] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:05.082 DEBUG [ejHN52Wp] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:05.085 DEBUG [ejHN52Wp] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
15:18:05.085 DEBUG [ejHN52Wp] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:05.084993800(LocalDateTime)
15:18:05.087 DEBUG [ejHN52Wp] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:05.088 DEBUG [ejHN52Wp] [1] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:18:05.088 DEBUG [ejHN52Wp] [1] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:18:05.089 DEBUG [ejHN52Wp] [1] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:05.089 DEBUG [ejHN52Wp] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:05.089 DEBUG [ejHN52Wp] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:05.090 DEBUG [ejHN52Wp] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:05.091 DEBUG [ejHN52Wp] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/code 200 12ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/code
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODUsImV4cCI6MTc4MzA2MzA4NX0.va-tmc4WznWR0giUOlMDNexJUk-jhFTINP8WjhcxmF-yLFHRlfb59JKqyK2FBhZKG-rUiJupSUv-ohohqc9Ptg"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ejHN52Wp", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"code":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","inviterNickname":"测试用户","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:18:05","status":1,"createTime":"2026-07-02 15:18:05","shareTitle":"测试用户 邀请你加入智价云（药店版）","shareDescription":"登录智价云（药店版），邀请好友各得好礼","copyText":"我是测试用户，在这里发现了一个药店采购神器——智价云（药店版）！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/4FQ2CNX5填我的邀请码 4FQ2CNX5 完成注册，你也会获得会员权益！","rewardDescription":"邀请人每成功邀请1家药店注册，赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/4FQ2CNX5"},"timestamp":1782976685090}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.091 DEBUG [X38wc5Ah] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TESTCODE | IP: 127.0.0.1
15:18:05.092 DEBUG [X38wc5Ah] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
15:18:05.092 DEBUG [X38wc5Ah] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: TESTCODE(String)
15:18:05.093 DEBUG [X38wc5Ah] [] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:05.094  WARN [X38wc5Ah] [] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=3001, message=邀请码无效
15:18:05.095 DEBUG [X38wc5Ah] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TESTCODE 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/page/TESTCODE
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"X38wc5Ah", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685094}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.097 DEBUG [VnCUn4vv] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TESTCODE?channel=app | IP: 127.0.0.1
15:18:05.099 DEBUG [VnCUn4vv] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
15:18:05.099 DEBUG [VnCUn4vv] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: TESTCODE(String)
15:18:05.100 DEBUG [VnCUn4vv] [] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:05.100  WARN [VnCUn4vv] [] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=3001, message=邀请码无效
15:18:05.101 DEBUG [VnCUn4vv] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TESTCODE?channel=app 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/page/TESTCODE
       Parameters = {channel=[app]}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"VnCUn4vv", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685101}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.104 DEBUG [Zj8B6GkN] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TESTCODE?channel=wechat | IP: 127.0.0.1
15:18:05.105 DEBUG [Zj8B6GkN] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
15:18:05.105 DEBUG [Zj8B6GkN] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: TESTCODE(String)
15:18:05.107 DEBUG [Zj8B6GkN] [] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:05.107  WARN [Zj8B6GkN] [] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=3001, message=邀请码无效
15:18:05.108 DEBUG [Zj8B6GkN] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TESTCODE?channel=wechat 200 5ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/page/TESTCODE
       Parameters = {channel=[wechat]}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Zj8B6GkN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685107}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.110 DEBUG [Jgf2XDuZ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TESTCODE?channel=miniapp | IP: 127.0.0.1
15:18:05.112 DEBUG [Jgf2XDuZ] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
15:18:05.112 DEBUG [Jgf2XDuZ] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: TESTCODE(String)
15:18:05.114 DEBUG [Jgf2XDuZ] [] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:05.114  WARN [Jgf2XDuZ] [] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=3001, message=邀请码无效
15:18:05.115 DEBUG [Jgf2XDuZ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TESTCODE?channel=miniapp 200 5ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/page/TESTCODE
       Parameters = {channel=[miniapp]}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Jgf2XDuZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685114}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.121 DEBUG [jJ9MwVUX] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TESTCODE?channel=dingtalk | IP: 127.0.0.1
15:18:05.122 DEBUG [jJ9MwVUX] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
15:18:05.122 DEBUG [jJ9MwVUX] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: TESTCODE(String)
15:18:05.124 DEBUG [jJ9MwVUX] [] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:05.124  WARN [jJ9MwVUX] [] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=3001, message=邀请码无效
15:18:05.125 DEBUG [jJ9MwVUX] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TESTCODE?channel=dingtalk 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/page/TESTCODE
       Parameters = {channel=[dingtalk]}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"jJ9MwVUX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685124}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.128 DEBUG [pCDDxfVA] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TESTCODE?channel=feishu | IP: 127.0.0.1
15:18:05.129 DEBUG [pCDDxfVA] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
15:18:05.130 DEBUG [pCDDxfVA] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: TESTCODE(String)
15:18:05.132 DEBUG [pCDDxfVA] [] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:05.132  WARN [pCDDxfVA] [] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=3001, message=邀请码无效
15:18:05.133 DEBUG [pCDDxfVA] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TESTCODE?channel=feishu 200 5ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/page/TESTCODE
       Parameters = {channel=[feishu]}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"pCDDxfVA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685132}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.135 DEBUG [P5czgMbB] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/ANYCODE | IP: 127.0.0.1
15:18:05.137 DEBUG [P5czgMbB] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
15:18:05.137 DEBUG [P5czgMbB] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: ANYCODE(String)
15:18:05.138 DEBUG [P5czgMbB] [] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:05.139  WARN [P5czgMbB] [] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=3001, message=邀请码无效
15:18:05.139 DEBUG [P5czgMbB] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/ANYCODE 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/page/ANYCODE
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"P5czgMbB", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685139}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.142 DEBUG [R7aMMLsM] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/invite/click/TESTCODE | IP: 127.0.0.1
15:18:05.143 DEBUG [R7aMMLsM] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
15:18:05.143 DEBUG [R7aMMLsM] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: TESTCODE(String)
15:18:05.146 DEBUG [R7aMMLsM] [] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:05.146 DEBUG [R7aMMLsM] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/invite/click/TESTCODE 200 4ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/invite/click/TESTCODE
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#trackClick(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"R7aMMLsM", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976685146}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.149 DEBUG [2Mq9VEEj] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/invite/click/TESTCODE | IP: 127.0.0.1
15:18:05.151 DEBUG [2Mq9VEEj] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
15:18:05.151 DEBUG [2Mq9VEEj] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: TESTCODE(String)
15:18:05.153 DEBUG [2Mq9VEEj] [] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:05.153 DEBUG [2Mq9VEEj] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/invite/click/TESTCODE 200 4ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/invite/click/TESTCODE
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#trackClick(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"2Mq9VEEj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976685153}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:05.156 DEBUG [vWY9MBWL] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/invite/click/NONEXISTENT | IP: 127.0.0.1
15:18:05.157 DEBUG [vWY9MBWL] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
15:18:05.157 DEBUG [vWY9MBWL] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: NONEXISTENT(String)
15:18:05.159 DEBUG [vWY9MBWL] [] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:05.160 DEBUG [vWY9MBWL] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/invite/click/NONEXISTENT 200 4ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/invite/click/NONEXISTENT
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#trackClick(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"vWY9MBWL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976685159}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 21, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.310 s -- in 邀请系统接口测试
[INFO] Running 会员体系接口测试
15:18:05.164  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.MembershipControllerTest]: MembershipControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:05.166  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.MembershipControllerTest
15:18:08.360 DEBUG [5UU8Mxdb] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/membership/grant | IP: 127.0.0.1
15:18:08.361 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.361 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.363 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.368 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.369 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.370 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.371 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
15:18:08.371 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long), 1(Integer)
15:18:08.374 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 0
15:18:08.374 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.U.insert               : ==>  Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:08.374 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.U.insert               : ==> Parameters: 2072580566367019009(Long), 1(Long), PLUS(String), ADMIN_GRANT(String), 2026-07-02T15:18:08.374546(LocalDateTime), 1(Integer), 测试初始化(String), 2026-07-02T15:18:08.374546(LocalDateTime), 2026-07-02T15:18:08.374546(LocalDateTime)
15:18:08.377 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.U.insert               : <==    Updates: 1
15:18:08.377 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, token_version=?, create_time=?, update_time=? WHERE id=?
15:18:08.378 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 0(Long), 2026-07-02T15:18:08(LocalDateTime), 2026-07-02T15:18:08(LocalDateTime), 1(Long)
15:18:08.380 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:08.381 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:08.381 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580566429933570(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:08.381052(LocalDateTime), USER(String), UPDATE(String), 修改用户信息(String), USER(String), 1(Long), MEMBERSHIP:1->PLUS(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:08.381052(LocalDateTime)
15:18:08.384 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:08.385 DEBUG [5UU8Mxdb] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 修改用户信息
15:18:08.385  INFO [5UU8Mxdb] [1] [        main] c.x.u.s.MembershipService      : 运营人员1为用户1发放会员等级PLUS
15:18:08.385 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.385 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.386 DEBUG [5UU8Mxdb] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.391 DEBUG [5UU8Mxdb] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/membership/grant 200 31ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/membership/grant
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ", Content-Length:"77"]
             Body = {"userId":1,"level":"PLUS","source":"ADMIN_GRANT","remark":"测试初始化"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminMembershipController
           Method = com.xuekairui.user.controller.AdminMembershipController#grantMembership(GrantMembershipRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"5UU8Mxdb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":2072580566367019009,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PLUS","levelName":"普通会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"测试初始化","createTime":"2026-07-02 15:18:08"},"timestamp":1782976688391}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:08.397 DEBUG [85Q8WsTS] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my | IP: 127.0.0.1
15:18:08.398 DEBUG [85Q8WsTS] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.398 DEBUG [85Q8WsTS] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.399 DEBUG [85Q8WsTS] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.400 DEBUG [85Q8WsTS] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:08.400 DEBUG [85Q8WsTS] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:08.401 DEBUG [85Q8WsTS] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 1
15:18:08.401 DEBUG [85Q8WsTS] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.402 DEBUG [85Q8WsTS] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.403 DEBUG [85Q8WsTS] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.404 DEBUG [85Q8WsTS] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my 200 7ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/my
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"85Q8WsTS", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":2072580566367019009,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PLUS","levelName":"普通会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"测试初始化","createTime":"2026-07-02 15:18:08"},"timestamp":1782976688403}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:08.410 DEBUG [feh9NG37] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/benefits?level=PLUS | IP: 127.0.0.1
15:18:08.411 DEBUG [feh9NG37] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.411 DEBUG [feh9NG37] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.412 DEBUG [feh9NG37] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.413 DEBUG [feh9NG37] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:08.414 DEBUG [feh9NG37] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:08.416 DEBUG [feh9NG37] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:08.418 DEBUG [feh9NG37] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/benefits?level=PLUS 200 8ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/benefits
       Parameters = {level=[PLUS]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#getBenefits(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"feh9NG37", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"benefitType":"DAILY_QUOTA","benefitTypeName":"每日查询配额","benefitValue":10,"description":"普通会员：每日有效查询10次"},{"benefitType":"MONTHLY_QUOTA","benefitTypeName":"每月爬虫加成","benefitValue":300,"description":"普通会员：每月查询300次"},{"benefitType":"YEARLY_QUOTA","benefitTypeName":"YEARLY_QUOTA","benefitValue":3650,"description":"普通会员：每年查询3650次（10*365）"}],"timestamp":1782976688417}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:08.421 DEBUG [LahQpFLm] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my | IP: 127.0.0.1
15:18:08.423  WARN [LahQpFLm] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/my
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"LahQpFLm", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976688422}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:08.429 DEBUG [6m7WyS8W] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/benefits | IP: 127.0.0.1
15:18:08.429 DEBUG [6m7WyS8W] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.429 DEBUG [6m7WyS8W] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.431 DEBUG [6m7WyS8W] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.432 DEBUG [6m7WyS8W] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:08.432 DEBUG [6m7WyS8W] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:08.434 DEBUG [6m7WyS8W] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:08.435 DEBUG [6m7WyS8W] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/benefits 200 6ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/benefits
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#getBenefits(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"6m7WyS8W", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"benefitType":"DAILY_QUOTA","benefitTypeName":"每日查询配额","benefitValue":10,"description":"普通会员：每日有效查询10次"},{"benefitType":"MONTHLY_QUOTA","benefitTypeName":"每月爬虫加成","benefitValue":300,"description":"普通会员：每月查询300次"},{"benefitType":"YEARLY_QUOTA","benefitTypeName":"YEARLY_QUOTA","benefitValue":3650,"description":"普通会员：每年查询3650次（10*365）"}],"timestamp":1782976688434}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:08.441 DEBUG [FVuPXp7b] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/benefits?level=PRO | IP: 127.0.0.1
15:18:08.441 DEBUG [FVuPXp7b] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.441 DEBUG [FVuPXp7b] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.444 DEBUG [FVuPXp7b] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.445 DEBUG [FVuPXp7b] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:08.445 DEBUG [FVuPXp7b] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:18:08.446 DEBUG [FVuPXp7b] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:08.447 DEBUG [FVuPXp7b] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/benefits?level=PRO 200 7ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/benefits
       Parameters = {level=[PRO]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#getBenefits(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"FVuPXp7b", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"benefitType":"DAILY_QUOTA","benefitTypeName":"每日查询配额","benefitValue":999,"description":"高级会员：每日不限量"},{"benefitType":"MAX_CONCURRENT","benefitTypeName":"最大并发加成","benefitValue":5,"description":"高级会员最大并发数"},{"benefitType":"MONTHLY_QUOTA","benefitTypeName":"每月爬虫加成","benefitValue":29970,"description":"高级会员：每月查询29970次（999*30）"},{"benefitType":"YEARLY_QUOTA","benefitTypeName":"YEARLY_QUOTA","benefitValue":364635,"description":"高级会员：每年查询364635次（999*365）"}],"timestamp":1782976688446}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:08.453 DEBUG [t2pUyrX4] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/benefits?level=ULTRA | IP: 127.0.0.1
15:18:08.454 DEBUG [t2pUyrX4] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.454 DEBUG [t2pUyrX4] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.456 DEBUG [t2pUyrX4] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.458 DEBUG [t2pUyrX4] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:08.458 DEBUG [t2pUyrX4] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:18:08.460 DEBUG [t2pUyrX4] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:08.461 DEBUG [t2pUyrX4] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/benefits?level=ULTRA 200 8ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/benefits
       Parameters = {level=[ULTRA]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#getBenefits(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"t2pUyrX4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"benefitType":"DAILY_QUOTA","benefitTypeName":"每日查询配额","benefitValue":999,"description":"超级会员：每日不限量"},{"benefitType":"MAX_CONCURRENT","benefitTypeName":"最大并发加成","benefitValue":10,"description":"超级会员最大并发数"},{"benefitType":"MONTHLY_QUOTA","benefitTypeName":"每月爬虫加成","benefitValue":29970,"description":"超级会员：每月查询29970次（999*30）"},{"benefitType":"YEARLY_QUOTA","benefitTypeName":"YEARLY_QUOTA","benefitValue":364635,"description":"超级会员：每年查询364635次（999*365）"}],"timestamp":1782976688460}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:08.467 DEBUG [Eveha6v8] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/membership/grant | IP: 127.0.0.1
15:18:08.468 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.468 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.470 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.472 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.473 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.475 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.475 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
15:18:08.475 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long), 1(Integer)
15:18:08.476 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 1
15:18:08.478 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.U.updateById           : ==>  Preparing: UPDATE t_user_membership SET user_id=?, level=?, source=?, effective_from=?, status=?, remark=?, create_time=?, update_time=? WHERE id=?
15:18:08.478 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.U.updateById           : ==> Parameters: 1(Long), PLUS(String), ADMIN_GRANT(String), 2026-07-02T15:18:08(LocalDateTime), 0(Integer), 测试初始化(String), 2026-07-02T15:18:08(LocalDateTime), 2026-07-02T15:18:08(LocalDateTime), 2072580566367019009(Long)
15:18:08.480 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.U.updateById           : <==    Updates: 1
15:18:08.481 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.U.insert               : ==>  Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:08.481 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.U.insert               : ==> Parameters: 2072580566815809538(Long), 1(Long), PRO(String), ADMIN_GRANT(String), 2026-07-02T15:18:08.480846500(LocalDateTime), 1(Integer), 测试发放(String), 2026-07-02T15:18:08.480846500(LocalDateTime), 2026-07-02T15:18:08.480846500(LocalDateTime)
15:18:08.484 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.U.insert               : <==    Updates: 1
15:18:08.484 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, token_version=?, create_time=?, update_time=? WHERE id=?
15:18:08.484 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 0(Long), 2026-07-02T15:18:08(LocalDateTime), 2026-07-02T15:18:08(LocalDateTime), 1(Long)
15:18:08.487 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:08.488 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:08.488 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580566878724097(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:08.487671(LocalDateTime), USER(String), UPDATE(String), 修改用户信息(String), USER(String), 1(Long), MEMBERSHIP:1->PRO(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:08.488175700(LocalDateTime)
15:18:08.491 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:08.491 DEBUG [Eveha6v8] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 修改用户信息
15:18:08.491  INFO [Eveha6v8] [1] [        main] c.x.u.s.MembershipService      : 运营人员1为用户1发放会员等级PRO
15:18:08.491 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.491 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.492 DEBUG [Eveha6v8] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.497 DEBUG [Eveha6v8] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/membership/grant 200 30ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/membership/grant
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ", Content-Length:"73"]
             Body = {"userId":1,"level":"PRO","source":"ADMIN_GRANT","remark":"测试发放"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminMembershipController
           Method = com.xuekairui.user.controller.AdminMembershipController#grantMembership(GrantMembershipRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Eveha6v8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":2072580566815809538,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PRO","levelName":"高级会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"测试发放","createTime":"2026-07-02 15:18:08"},"timestamp":1782976688496}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:08.503 DEBUG [d8GMgdat] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/membership/grant | IP: 127.0.0.1
15:18:08.504 DEBUG [d8GMgdat] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.504 DEBUG [d8GMgdat] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.506 DEBUG [d8GMgdat] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.508 DEBUG [d8GMgdat] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.508 DEBUG [d8GMgdat] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.509 DEBUG [d8GMgdat] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.511  WARN [d8GMgdat] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=400, message=会员等级无效
15:18:08.512 DEBUG [d8GMgdat] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/membership/grant 200 9ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/membership/grant
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ", Content-Length:"53"]
             Body = {"userId":1,"level":"INVALID","source":"ADMIN_GRANT"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminMembershipController
           Method = com.xuekairui.user.controller.AdminMembershipController#grantMembership(GrantMembershipRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"d8GMgdat", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"会员等级无效","data":null,"timestamp":1782976688511}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:08.515 DEBUG [v8fmDGQP] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/membership/grant | IP: 127.0.0.1
15:18:08.516  WARN [v8fmDGQP] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/membership/grant 401 1ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/membership/grant
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"49"]
             Body = {"userId":1,"level":"PRO","source":"ADMIN_GRANT"}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"v8fmDGQP", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976688515}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:08.521 DEBUG [VE4WP664] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/membership/memberships?page=1&size=10 | IP: 127.0.0.1
15:18:08.521 DEBUG [VE4WP664] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.521 DEBUG [VE4WP664] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.523 DEBUG [VE4WP664] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.528 DEBUG [VE4WP664] [1] [        main] c.x.u.m.U.selectList_mpCount   : ==>  Preparing: SELECT COUNT(*) AS total FROM t_user_membership
15:18:08.528 DEBUG [VE4WP664] [1] [        main] c.x.u.m.U.selectList_mpCount   : ==> Parameters: 
15:18:08.530 DEBUG [VE4WP664] [1] [        main] c.x.u.m.U.selectList_mpCount   : <==      Total: 1
15:18:08.530 DEBUG [VE4WP664] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership ORDER BY create_time DESC LIMIT ?
15:18:08.531 DEBUG [VE4WP664] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 10(Long)
15:18:08.532 DEBUG [VE4WP664] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 2
15:18:08.534 DEBUG [VE4WP664] [1] [        main] c.x.u.m.U.selectByIds          : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id IN ( ? )
15:18:08.534 DEBUG [VE4WP664] [1] [        main] c.x.u.m.U.selectByIds          : ==> Parameters: 1(Long)
15:18:08.536 DEBUG [VE4WP664] [1] [        main] c.x.u.m.U.selectByIds          : <==      Total: 1
15:18:08.537 DEBUG [VE4WP664] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/membership/memberships?page=1&size=10 200 16ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/membership/memberships
       Parameters = {page=[1], size=[10]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminMembershipController
           Method = com.xuekairui.user.controller.AdminMembershipController#listMemberships(Integer, Integer, Long, String, String, String, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"VE4WP664", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"records":[{"id":2072580566367019009,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PLUS","levelName":"普通会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":0,"remark":"测试初始化","createTime":"2026-07-02 15:18:08"},{"id":2072580566815809538,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PRO","levelName":"高级会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"测试发放","createTime":"2026-07-02 15:18:08"}],"total":2,"size":10,"current":1,"pages":1},"timestamp":1782976688537}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:08.542 DEBUG [JH62Em77] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/membership/memberships?page=1&size=10&userId=1 | IP: 127.0.0.1
15:18:08.543 DEBUG [JH62Em77] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.543 DEBUG [JH62Em77] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.544 DEBUG [JH62Em77] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.554 DEBUG [JH62Em77] [1] [        main] c.x.u.m.U.selectList_mpCount   : ==>  Preparing: SELECT COUNT(*) AS total FROM t_user_membership WHERE (user_id = ?)
15:18:08.554 DEBUG [JH62Em77] [1] [        main] c.x.u.m.U.selectList_mpCount   : ==> Parameters: 1(Long)
15:18:08.556 DEBUG [JH62Em77] [1] [        main] c.x.u.m.U.selectList_mpCount   : <==      Total: 1
15:18:08.556 DEBUG [JH62Em77] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ?) ORDER BY create_time DESC LIMIT ?
15:18:08.556 DEBUG [JH62Em77] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long), 10(Long)
15:18:08.558 DEBUG [JH62Em77] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 2
15:18:08.558 DEBUG [JH62Em77] [1] [        main] c.x.u.m.U.selectByIds          : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id IN ( ? )
15:18:08.559 DEBUG [JH62Em77] [1] [        main] c.x.u.m.U.selectByIds          : ==> Parameters: 1(Long)
15:18:08.560 DEBUG [JH62Em77] [1] [        main] c.x.u.m.U.selectByIds          : <==      Total: 1
15:18:08.561 DEBUG [JH62Em77] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/membership/memberships?page=1&size=10&userId=1 200 19ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/membership/memberships
       Parameters = {page=[1], size=[10], userId=[1]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminMembershipController
           Method = com.xuekairui.user.controller.AdminMembershipController#listMemberships(Integer, Integer, Long, String, String, String, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"JH62Em77", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"records":[{"id":2072580566367019009,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PLUS","levelName":"普通会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":0,"remark":"测试初始化","createTime":"2026-07-02 15:18:08"},{"id":2072580566815809538,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PRO","levelName":"高级会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"测试发放","createTime":"2026-07-02 15:18:08"}],"total":2,"size":10,"current":1,"pages":1},"timestamp":1782976688560}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:08.567 DEBUG [9bkfqEx2] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/membership/memberships?page=1&size=10&level=PLUS | IP: 127.0.0.1
15:18:08.568 DEBUG [9bkfqEx2] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:08.568 DEBUG [9bkfqEx2] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:08.570 DEBUG [9bkfqEx2] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:08.573 DEBUG [9bkfqEx2] [1] [        main] c.x.u.m.U.selectList_mpCount   : ==>  Preparing: SELECT COUNT(*) AS total FROM t_user_membership WHERE (level = ?)
15:18:08.573 DEBUG [9bkfqEx2] [1] [        main] c.x.u.m.U.selectList_mpCount   : ==> Parameters: PLUS(String)
15:18:08.576 DEBUG [9bkfqEx2] [1] [        main] c.x.u.m.U.selectList_mpCount   : <==      Total: 1
15:18:08.576 DEBUG [9bkfqEx2] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (level = ?) ORDER BY create_time DESC LIMIT ?
15:18:08.576 DEBUG [9bkfqEx2] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: PLUS(String), 10(Long)
15:18:08.578 DEBUG [9bkfqEx2] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 1
15:18:08.578 DEBUG [9bkfqEx2] [1] [        main] c.x.u.m.U.selectByIds          : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id IN ( ? )
15:18:08.578 DEBUG [9bkfqEx2] [1] [        main] c.x.u.m.U.selectByIds          : ==> Parameters: 1(Long)
15:18:08.580 DEBUG [9bkfqEx2] [1] [        main] c.x.u.m.U.selectByIds          : <==      Total: 1
15:18:08.581 DEBUG [9bkfqEx2] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/membership/memberships?page=1&size=10&level=PLUS 200 14ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/membership/memberships
       Parameters = {page=[1], size=[10], level=[PLUS]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminMembershipController
           Method = com.xuekairui.user.controller.AdminMembershipController#listMemberships(Integer, Integer, Long, String, String, String, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"9bkfqEx2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"records":[{"id":2072580566367019009,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PLUS","levelName":"普通会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":0,"remark":"测试初始化","createTime":"2026-07-02 15:18:08"}],"total":1,"size":10,"current":1,"pages":1},"timestamp":1782976688580}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:08.585 DEBUG [t5QkNrDG] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/membership/memberships?page=1&size=10 | IP: 127.0.0.1
15:18:08.587  WARN [t5QkNrDG] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/membership/memberships?page=1&size=10 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/membership/memberships
       Parameters = {page=[1], size=[10]}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"t5QkNrDG", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976688586}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.425 s -- in 会员体系接口测试
[INFO] Running 操作审计日志接口测试
15:18:08.591  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.OperationAuditLogTest]: OperationAuditLogTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:08.593  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.OperationAuditLogTest
15:18:10.931 DEBUG [8QgaBN5M] [] [scheduling-2] c.x.p.m.P.selectDueForDeduct   : ==>  Preparing: SELECT * FROM t_payment_agreement WHERE status = 'SIGNED' AND next_deduct_time IS NOT NULL AND next_deduct_time <= ? ORDER BY next_deduct_time ASC
15:18:10.931 DEBUG [8QgaBN5M] [] [scheduling-2] c.x.p.m.P.selectDueForDeduct   : ==> Parameters: 2026-07-02T15:18:10.929491200(LocalDateTime)
15:18:10.932 DEBUG [8QgaBN5M] [] [scheduling-2] c.x.p.m.P.selectDueForDeduct   : <==      Total: 0
15:18:11.084 DEBUG [gSCLu3Gv] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==>  Preparing: SELECT * FROM t_payment_order WHERE status = 'PENDING' AND expire_time < ?
15:18:11.085 DEBUG [gSCLu3Gv] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==> Parameters: 2026-07-02T15:18:11.084515200(LocalDateTime)
15:18:11.226 ERROR [gSCLu3Gv] [] [scheduling-1] c.x.user.config.AsyncConfig    : 定时任务执行异常

org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Table 'zhijiayun_pharmacy.t_payment_order' doesn't exist
### The error may exist in com/xuekairui/payment/mapper/PaymentOrderMapper.java (best guess)
### The error may involve com.xuekairui.payment.mapper.PaymentOrderMapper.selectExpiredPending-Inline
### The error occurred while setting parameters
### SQL: SELECT * FROM t_payment_order WHERE status = 'PENDING' AND expire_time < ?
### Cause: java.sql.SQLSyntaxErrorException: Table 'zhijiayun_pharmacy.t_payment_order' doesn't exist
; bad SQL grammar []
	at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:246)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107)
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:95)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:347)
	at jdk.proxy2/jdk.proxy2.$Proxy127.selectList(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:194)
	at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)
	at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)
	at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)
	at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)
	at jdk.proxy2/jdk.proxy2.$Proxy160.selectExpiredPending(Unknown Source)
	at com.xuekairui.payment.service.PaymentOrderService.cleanupExpiredOrders(PaymentOrderService.java:373)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)
	at com.xuekairui.payment.service.PaymentOrderService$$SpringCGLIB$$0.cleanupExpiredOrders(<generated>)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130)
	at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124)
	at io.micrometer.observation.Observation.observe(Observation.java:498)
	at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124)
	at org.springframework.scheduling.config.Task$OutcomeTrackingRunnable.run(Task.java:87)
	at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
	at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
	at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
	at com.xuekairui.user.config.AsyncConfig$MdcTraceIdTaskDecorator.lambda$decorate$0(AsyncConfig.java:84)
	at org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler$DelegatingRunnableScheduledFuture.run(ThreadPoolTaskScheduler.java:508)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:842)
Caused by: java.sql.SQLSyntaxErrorException: Table 'zhijiayun_pharmacy.t_payment_order' doesn't exist
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:112)
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:114)
	at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:990)
	at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:384)
	at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44)
	at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java)
	at jdk.internal.reflect.GeneratedMethodAccessor27.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)
	at jdk.proxy3/jdk.proxy3.$Proxy182.execute(Unknown Source)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)
	at jdk.internal.reflect.GeneratedMethodAccessor33.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
	at jdk.proxy2/jdk.proxy2.$Proxy180.query(Unknown Source)
	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)
	at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)
	at jdk.proxy2/jdk.proxy2.$Proxy179.query(Unknown Source)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)
	at jdk.internal.reflect.GeneratedMethodAccessor103.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333)
	... 38 common frames omitted

15:18:11.574 DEBUG [ENh4NUTh] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log | IP: 127.0.0.1
15:18:11.574 DEBUG [ENh4NUTh] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.575 DEBUG [ENh4NUTh] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.576 DEBUG [ENh4NUTh] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.580 DEBUG [ENh4NUTh] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==>  Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log
15:18:11.580 DEBUG [ENh4NUTh] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==> Parameters: 
15:18:11.584 DEBUG [ENh4NUTh] [1] [        main] c.x.u.m.O.selectList_mpCount   : <==      Total: 1
15:18:11.585 DEBUG [ENh4NUTh] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log 200 11ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ENh4NUTh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691584}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.591 DEBUG [ccHp7WWP] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log?page=1&size=10 | IP: 127.0.0.1
15:18:11.592 DEBUG [ccHp7WWP] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.592 DEBUG [ccHp7WWP] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.593 DEBUG [ccHp7WWP] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.597 DEBUG [ccHp7WWP] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==>  Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log
15:18:11.597 DEBUG [ccHp7WWP] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==> Parameters: 
15:18:11.599 DEBUG [ccHp7WWP] [1] [        main] c.x.u.m.O.selectList_mpCount   : <==      Total: 1
15:18:11.600 DEBUG [ccHp7WWP] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log?page=1&size=10 200 8ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log
       Parameters = {page=[1], size=[10]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ccHp7WWP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":10,"current":1,"pages":0},"timestamp":1782976691599}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.606 DEBUG [3vygFTkd] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log?module=USER | IP: 127.0.0.1
15:18:11.606 DEBUG [3vygFTkd] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.607 DEBUG [3vygFTkd] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.608 DEBUG [3vygFTkd] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.613 DEBUG [3vygFTkd] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==>  Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (module = ?)
15:18:11.613 DEBUG [3vygFTkd] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==> Parameters: USER(String)
15:18:11.615 DEBUG [3vygFTkd] [1] [        main] c.x.u.m.O.selectList_mpCount   : <==      Total: 1
15:18:11.615 DEBUG [3vygFTkd] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log?module=USER 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log
       Parameters = {module=[USER]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"3vygFTkd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691615}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.620 DEBUG [gQnthUv2] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log?operationType=USER_LOGIN | IP: 127.0.0.1
15:18:11.621 DEBUG [gQnthUv2] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.621 DEBUG [gQnthUv2] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.622 DEBUG [gQnthUv2] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.627 DEBUG [gQnthUv2] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==>  Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (operation_type = ?)
15:18:11.627 DEBUG [gQnthUv2] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==> Parameters: USER_LOGIN(String)
15:18:11.629 DEBUG [gQnthUv2] [1] [        main] c.x.u.m.O.selectList_mpCount   : <==      Total: 1
15:18:11.629 DEBUG [gQnthUv2] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log?operationType=USER_LOGIN 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log
       Parameters = {operationType=[USER_LOGIN]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"gQnthUv2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691629}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.636 DEBUG [SrDX528q] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log?operatorId=1 | IP: 127.0.0.1
15:18:11.637 DEBUG [SrDX528q] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.637 DEBUG [SrDX528q] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.638 DEBUG [SrDX528q] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.643 DEBUG [SrDX528q] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==>  Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (operator_id = ?)
15:18:11.643 DEBUG [SrDX528q] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==> Parameters: 1(Long)
15:18:11.644 DEBUG [SrDX528q] [1] [        main] c.x.u.m.O.selectList_mpCount   : <==      Total: 1
15:18:11.645 DEBUG [SrDX528q] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log?operatorId=1 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log
       Parameters = {operatorId=[1]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"SrDX528q", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691645}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.650 DEBUG [KTAGdS8E] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log?isSensitive=true | IP: 127.0.0.1
15:18:11.650 DEBUG [KTAGdS8E] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.650 DEBUG [KTAGdS8E] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.652 DEBUG [KTAGdS8E] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.656 DEBUG [KTAGdS8E] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==>  Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (is_sensitive = ?)
15:18:11.656 DEBUG [KTAGdS8E] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==> Parameters: true(Boolean)
15:18:11.659 DEBUG [KTAGdS8E] [1] [        main] c.x.u.m.O.selectList_mpCount   : <==      Total: 1
15:18:11.659 DEBUG [KTAGdS8E] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log?isSensitive=true 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log
       Parameters = {isSensitive=[true]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"KTAGdS8E", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691659}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.665 DEBUG [KhH6urLQ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log?isSensitive=false | IP: 127.0.0.1
15:18:11.666 DEBUG [KhH6urLQ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.666 DEBUG [KhH6urLQ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.667 DEBUG [KhH6urLQ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.670 DEBUG [KhH6urLQ] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==>  Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (is_sensitive = ?)
15:18:11.670 DEBUG [KhH6urLQ] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==> Parameters: false(Boolean)
15:18:11.673 DEBUG [KhH6urLQ] [1] [        main] c.x.u.m.O.selectList_mpCount   : <==      Total: 1
15:18:11.674 DEBUG [KhH6urLQ] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log?isSensitive=false 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log
       Parameters = {isSensitive=[false]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"KhH6urLQ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691673}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.680 DEBUG [w7fWqg8P] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log | IP: 127.0.0.1
15:18:11.681 DEBUG [w7fWqg8P] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.681 DEBUG [w7fWqg8P] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.683 DEBUG [w7fWqg8P] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.692 DEBUG [w7fWqg8P] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==>  Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (operation_time >= ? AND operation_time <= ?)
15:18:11.693 DEBUG [w7fWqg8P] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==> Parameters: 2024-01-01T00:00(LocalDateTime), 2030-12-31T23:59:59(LocalDateTime)
15:18:11.694 DEBUG [w7fWqg8P] [1] [        main] c.x.u.m.O.selectList_mpCount   : <==      Total: 1
15:18:11.695 DEBUG [w7fWqg8P] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log 200 15ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log
       Parameters = {startTime=[2024-01-01T00:00:00], endTime=[2030-12-31T23:59:59]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"w7fWqg8P", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691695}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.701 DEBUG [A6uLPnwG] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log | IP: 127.0.0.1
15:18:11.701 DEBUG [A6uLPnwG] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.701 DEBUG [A6uLPnwG] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.703 DEBUG [A6uLPnwG] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.707 DEBUG [A6uLPnwG] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==>  Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (module = ? AND operator_id = ?)
15:18:11.707 DEBUG [A6uLPnwG] [1] [        main] c.x.u.m.O.selectList_mpCount   : ==> Parameters: USER(String), 1(Long)
15:18:11.708 DEBUG [A6uLPnwG] [1] [        main] c.x.u.m.O.selectList_mpCount   : <==      Total: 1
15:18:11.709 DEBUG [A6uLPnwG] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log 200 8ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log
       Parameters = {module=[USER], operatorId=[1], page=[1], size=[5]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"A6uLPnwG", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":5,"current":1,"pages":0},"timestamp":1782976691708}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.713 DEBUG [GV5KFCU5] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log | IP: 127.0.0.1
15:18:11.714  WARN [GV5KFCU5] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"GV5KFCU5", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976691714}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.721 DEBUG [UvuYtdUN] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/sensitive | IP: 127.0.0.1
15:18:11.722 DEBUG [UvuYtdUN] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.722 DEBUG [UvuYtdUN] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.724 DEBUG [UvuYtdUN] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.725 DEBUG [UvuYtdUN] [1] [        main] c.x.u.m.O.selectSensitiveLogs  : ==>  Preparing: SELECT * FROM t_operation_audit_log WHERE is_sensitive = true AND operation_time >= ? ORDER BY operation_time DESC
15:18:11.725 DEBUG [UvuYtdUN] [1] [        main] c.x.u.m.O.selectSensitiveLogs  : ==> Parameters: null
15:18:11.728 DEBUG [UvuYtdUN] [1] [        main] c.x.u.m.O.selectSensitiveLogs  : <==      Total: 0
15:18:11.728 DEBUG [UvuYtdUN] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/sensitive 200 7ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/sensitive
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getSensitiveLogs(LocalDateTime)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"UvuYtdUN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691728}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.735 DEBUG [FL6aeUZc] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/sensitive | IP: 127.0.0.1
15:18:11.736 DEBUG [FL6aeUZc] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.736 DEBUG [FL6aeUZc] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.738 DEBUG [FL6aeUZc] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.739 DEBUG [FL6aeUZc] [1] [        main] c.x.u.m.O.selectSensitiveLogs  : ==>  Preparing: SELECT * FROM t_operation_audit_log WHERE is_sensitive = true AND operation_time >= ? ORDER BY operation_time DESC
15:18:11.739 DEBUG [FL6aeUZc] [1] [        main] c.x.u.m.O.selectSensitiveLogs  : ==> Parameters: 2024-01-01T00:00(LocalDateTime)
15:18:11.741 DEBUG [FL6aeUZc] [1] [        main] c.x.u.m.O.selectSensitiveLogs  : <==      Total: 0
15:18:11.742 DEBUG [FL6aeUZc] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/sensitive 200 7ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/sensitive
       Parameters = {startTime=[2024-01-01T00:00:00]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getSensitiveLogs(LocalDateTime)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"FL6aeUZc", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691741}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.745 DEBUG [9sPcUeRS] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/sensitive | IP: 127.0.0.1
15:18:11.746  WARN [9sPcUeRS] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/sensitive 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/sensitive
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"9sPcUeRS", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976691745}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.754 DEBUG [PB7crpdZ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/user/1 | IP: 127.0.0.1
15:18:11.756 DEBUG [PB7crpdZ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.756 DEBUG [PB7crpdZ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.758 DEBUG [PB7crpdZ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.759 DEBUG [PB7crpdZ] [1] [        main] c.x.u.m.O.selectByOperatorId   : ==>  Preparing: SELECT * FROM t_operation_audit_log WHERE operator_id = ? ORDER BY operation_time DESC LIMIT ?
15:18:11.760 DEBUG [PB7crpdZ] [1] [        main] c.x.u.m.O.selectByOperatorId   : ==> Parameters: 1(Long), 50(Integer)
15:18:11.761 DEBUG [PB7crpdZ] [1] [        main] c.x.u.m.O.selectByOperatorId   : <==      Total: 0
15:18:11.762 DEBUG [PB7crpdZ] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/user/1 200 10ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/user/1
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getUserLogs(Long, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"PB7crpdZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691761}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.769 DEBUG [zcvV3WWv] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/user/1?limit=10 | IP: 127.0.0.1
15:18:11.769 DEBUG [zcvV3WWv] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.770 DEBUG [zcvV3WWv] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.771 DEBUG [zcvV3WWv] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.772 DEBUG [zcvV3WWv] [1] [        main] c.x.u.m.O.selectByOperatorId   : ==>  Preparing: SELECT * FROM t_operation_audit_log WHERE operator_id = ? ORDER BY operation_time DESC LIMIT ?
15:18:11.773 DEBUG [zcvV3WWv] [1] [        main] c.x.u.m.O.selectByOperatorId   : ==> Parameters: 1(Long), 10(Integer)
15:18:11.775 DEBUG [zcvV3WWv] [1] [        main] c.x.u.m.O.selectByOperatorId   : <==      Total: 0
15:18:11.776 DEBUG [zcvV3WWv] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/user/1?limit=10 200 7ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/user/1
       Parameters = {limit=[10]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getUserLogs(Long, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"zcvV3WWv", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691775}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.783 DEBUG [P6m5Zsx8] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/user/99999 | IP: 127.0.0.1
15:18:11.789 DEBUG [P6m5Zsx8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.789 DEBUG [P6m5Zsx8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.791 DEBUG [P6m5Zsx8] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.793 DEBUG [P6m5Zsx8] [1] [        main] c.x.u.m.O.selectByOperatorId   : ==>  Preparing: SELECT * FROM t_operation_audit_log WHERE operator_id = ? ORDER BY operation_time DESC LIMIT ?
15:18:11.793 DEBUG [P6m5Zsx8] [1] [        main] c.x.u.m.O.selectByOperatorId   : ==> Parameters: 99999(Long), 50(Integer)
15:18:11.795 DEBUG [P6m5Zsx8] [1] [        main] c.x.u.m.O.selectByOperatorId   : <==      Total: 0
15:18:11.796 DEBUG [P6m5Zsx8] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/user/99999 200 13ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/user/99999
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getUserLogs(Long, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"P6m5Zsx8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691795}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.800 DEBUG [YZgJ6zUE] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/user/1 | IP: 127.0.0.1
15:18:11.802  WARN [YZgJ6zUE] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/user/1 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/user/1
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"YZgJ6zUE", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976691801}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.808 DEBUG [XvY6LZJt] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/USER/1 | IP: 127.0.0.1
15:18:11.809 DEBUG [XvY6LZJt] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.809 DEBUG [XvY6LZJt] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.811 DEBUG [XvY6LZJt] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.812 DEBUG [XvY6LZJt] [1] [        main] c.x.u.m.O.selectByTarget       : ==>  Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
15:18:11.812 DEBUG [XvY6LZJt] [1] [        main] c.x.u.m.O.selectByTarget       : ==> Parameters: USER(String), 1(Long), 50(Integer)
15:18:11.815 DEBUG [XvY6LZJt] [1] [        main] c.x.u.m.O.selectByTarget       : <==      Total: 0
15:18:11.816 DEBUG [XvY6LZJt] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/USER/1 200 8ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/target/USER/1
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"XvY6LZJt", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691815}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.822 DEBUG [6sysmkbw] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/LEVEL_CONFIG/1?limit=20 | IP: 127.0.0.1
15:18:11.823 DEBUG [6sysmkbw] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.823 DEBUG [6sysmkbw] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.826 DEBUG [6sysmkbw] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.827 DEBUG [6sysmkbw] [1] [        main] c.x.u.m.O.selectByTarget       : ==>  Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
15:18:11.827 DEBUG [6sysmkbw] [1] [        main] c.x.u.m.O.selectByTarget       : ==> Parameters: LEVEL_CONFIG(String), 1(Long), 20(Integer)
15:18:11.828 DEBUG [6sysmkbw] [1] [        main] c.x.u.m.O.selectByTarget       : <==      Total: 0
15:18:11.829 DEBUG [6sysmkbw] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/LEVEL_CONFIG/1?limit=20 200 7ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/target/LEVEL_CONFIG/1
       Parameters = {limit=[20]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"6sysmkbw", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691828}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.835 DEBUG [tae52s5m] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/USER/1 | IP: 127.0.0.1
15:18:11.836 DEBUG [tae52s5m] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.836 DEBUG [tae52s5m] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.839 DEBUG [tae52s5m] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.840 DEBUG [tae52s5m] [1] [        main] c.x.u.m.O.selectByTarget       : ==>  Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
15:18:11.840 DEBUG [tae52s5m] [1] [        main] c.x.u.m.O.selectByTarget       : ==> Parameters: USER(String), 1(Long), 50(Integer)
15:18:11.842 DEBUG [tae52s5m] [1] [        main] c.x.u.m.O.selectByTarget       : <==      Total: 0
15:18:11.843 DEBUG [tae52s5m] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/USER/1 200 8ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/target/USER/1
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"tae52s5m", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691842}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.846 DEBUG [hUzGWdDc] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/LEVEL_CONFIG/1 | IP: 127.0.0.1
15:18:11.847 DEBUG [hUzGWdDc] [1] [        main] c.x.u.m.O.selectByTarget       : ==>  Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
15:18:11.848 DEBUG [hUzGWdDc] [1] [        main] c.x.u.m.O.selectByTarget       : ==> Parameters: LEVEL_CONFIG(String), 1(Long), 50(Integer)
15:18:11.849 DEBUG [hUzGWdDc] [1] [        main] c.x.u.m.O.selectByTarget       : <==      Total: 0
15:18:11.850 DEBUG [hUzGWdDc] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/LEVEL_CONFIG/1 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/target/LEVEL_CONFIG/1
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"hUzGWdDc", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691849}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.853 DEBUG [CTYCZSJb] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/PLATFORM/1 | IP: 127.0.0.1
15:18:11.854 DEBUG [CTYCZSJb] [1] [        main] c.x.u.m.O.selectByTarget       : ==>  Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
15:18:11.854 DEBUG [CTYCZSJb] [1] [        main] c.x.u.m.O.selectByTarget       : ==> Parameters: PLATFORM(String), 1(Long), 50(Integer)
15:18:11.856 DEBUG [CTYCZSJb] [1] [        main] c.x.u.m.O.selectByTarget       : <==      Total: 0
15:18:11.858 DEBUG [CTYCZSJb] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/PLATFORM/1 200 5ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/target/PLATFORM/1
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"CTYCZSJb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691857}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.861 DEBUG [gVKCzyT3] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/LICENSE/1 | IP: 127.0.0.1
15:18:11.863 DEBUG [gVKCzyT3] [1] [        main] c.x.u.m.O.selectByTarget       : ==>  Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
15:18:11.864 DEBUG [gVKCzyT3] [1] [        main] c.x.u.m.O.selectByTarget       : ==> Parameters: LICENSE(String), 1(Long), 50(Integer)
15:18:11.865 DEBUG [gVKCzyT3] [1] [        main] c.x.u.m.O.selectByTarget       : <==      Total: 0
15:18:11.866 DEBUG [gVKCzyT3] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/LICENSE/1 200 5ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/target/LICENSE/1
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"gVKCzyT3", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691865}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.869 DEBUG [EusDZXU9] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/INVITE/1 | IP: 127.0.0.1
15:18:11.870 DEBUG [EusDZXU9] [1] [        main] c.x.u.m.O.selectByTarget       : ==>  Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
15:18:11.870 DEBUG [EusDZXU9] [1] [        main] c.x.u.m.O.selectByTarget       : ==> Parameters: INVITE(String), 1(Long), 50(Integer)
15:18:11.872 DEBUG [EusDZXU9] [1] [        main] c.x.u.m.O.selectByTarget       : <==      Total: 0
15:18:11.873 DEBUG [EusDZXU9] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/INVITE/1 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/target/INVITE/1
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"EusDZXU9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691872}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.876 DEBUG [y2pEKWMS] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/COUPON/1 | IP: 127.0.0.1
15:18:11.877 DEBUG [y2pEKWMS] [1] [        main] c.x.u.m.O.selectByTarget       : ==>  Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
15:18:11.878 DEBUG [y2pEKWMS] [1] [        main] c.x.u.m.O.selectByTarget       : ==> Parameters: COUPON(String), 1(Long), 50(Integer)
15:18:11.879 DEBUG [y2pEKWMS] [1] [        main] c.x.u.m.O.selectByTarget       : <==      Total: 0
15:18:11.880 DEBUG [y2pEKWMS] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/COUPON/1 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/target/COUPON/1
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"y2pEKWMS", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691879}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.884 DEBUG [KFgx2Chc] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/USER/1 | IP: 127.0.0.1
15:18:11.885  WARN [KFgx2Chc] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/USER/1 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/target/USER/1
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"KFgx2Chc", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976691884}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.891 DEBUG [sQ8Sv4yp] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/stats?module=USER | IP: 127.0.0.1
15:18:11.892 DEBUG [sQ8Sv4yp] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.892 DEBUG [sQ8Sv4yp] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.894 DEBUG [sQ8Sv4yp] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.895 DEBUG [sQ8Sv4yp] [1] [        main] .m.O.countByModuleAndTimeRange : ==>  Preparing: SELECT COUNT(*) FROM t_operation_audit_log WHERE module = ? AND operation_time >= ? AND operation_time <= ?
15:18:11.895 DEBUG [sQ8Sv4yp] [1] [        main] .m.O.countByModuleAndTimeRange : ==> Parameters: USER(String), null, null
15:18:11.896 DEBUG [sQ8Sv4yp] [1] [        main] .m.O.countByModuleAndTimeRange : <==      Total: 1
15:18:11.898 DEBUG [sQ8Sv4yp] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/stats?module=USER 200 7ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/stats
       Parameters = {module=[USER]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getStats(String, LocalDateTime, LocalDateTime)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"sQ8Sv4yp", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"count":0},"timestamp":1782976691896}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.903 DEBUG [FdxkNSGd] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/stats?module=LEVEL | IP: 127.0.0.1
15:18:11.904 DEBUG [FdxkNSGd] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.904 DEBUG [FdxkNSGd] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.906 DEBUG [FdxkNSGd] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.907 DEBUG [FdxkNSGd] [1] [        main] .m.O.countByModuleAndTimeRange : ==>  Preparing: SELECT COUNT(*) FROM t_operation_audit_log WHERE module = ? AND operation_time >= ? AND operation_time <= ?
15:18:11.907 DEBUG [FdxkNSGd] [1] [        main] .m.O.countByModuleAndTimeRange : ==> Parameters: LEVEL(String), null, null
15:18:11.908 DEBUG [FdxkNSGd] [1] [        main] .m.O.countByModuleAndTimeRange : <==      Total: 1
15:18:11.909 DEBUG [FdxkNSGd] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/stats?module=LEVEL 200 6ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/stats
       Parameters = {module=[LEVEL]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getStats(String, LocalDateTime, LocalDateTime)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"FdxkNSGd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"count":0},"timestamp":1782976691909}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.914 DEBUG [ZvRyZ59a] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/stats | IP: 127.0.0.1
15:18:11.915 DEBUG [ZvRyZ59a] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.915 DEBUG [ZvRyZ59a] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.916 DEBUG [ZvRyZ59a] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.917 DEBUG [ZvRyZ59a] [1] [        main] .m.O.countByModuleAndTimeRange : ==>  Preparing: SELECT COUNT(*) FROM t_operation_audit_log WHERE module = ? AND operation_time >= ? AND operation_time <= ?
15:18:11.917 DEBUG [ZvRyZ59a] [1] [        main] .m.O.countByModuleAndTimeRange : ==> Parameters: USER(String), 2024-01-01T00:00(LocalDateTime), 2030-12-31T23:59:59(LocalDateTime)
15:18:11.919 DEBUG [ZvRyZ59a] [1] [        main] .m.O.countByModuleAndTimeRange : <==      Total: 1
15:18:11.920 DEBUG [ZvRyZ59a] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/stats 200 6ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/stats
       Parameters = {module=[USER], startTime=[2024-01-01T00:00:00], endTime=[2030-12-31T23:59:59]}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getStats(String, LocalDateTime, LocalDateTime)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ZvRyZ59a", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"count":0},"timestamp":1782976691919}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.925 DEBUG [cC3T6zhb] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/stats | IP: 127.0.0.1
15:18:11.926 DEBUG [cC3T6zhb] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:11.926 DEBUG [cC3T6zhb] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:11.928 DEBUG [cC3T6zhb] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:11.929 ERROR [cC3T6zhb] [1] [        main] c.x.h.GlobalExceptionHandler   : 系统异常

org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'module' for method parameter type String is not present
	at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValueInternal(RequestParamMethodArgumentResolver.java:220)
	at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:196)
	at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:125)
	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)
	at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:227)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:181)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
	at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:165)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
	at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
	at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:490)
	at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:351)
	at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:83)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:129)
	at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:101)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:125)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at com.xuekairui.user.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:143)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
	at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:334)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:225)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:52)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
	at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebSecurityConfiguration.java:319)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$4(HandlerMappingIntrospector.java:267)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
	at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:240)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at com.xuekairui.gateway.filter.RateLimitFilter.doFilterInternal(RateLimitFilter.java:56)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at com.xuekairui.gateway.filter.RequestLoggingFilter.doFilterInternal(RequestLoggingFilter.java:79)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:201)
	at com.xuekairui.gateway.OperationAuditLogTest.getStats_missingModule_shouldReturnError(OperationAuditLogTest.java:302)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:775)
	at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:479)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:216)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:212)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85)
	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
	at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)
	at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
	at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)
	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
	at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithoutCancellationToken(LauncherAdapter.java:60)
	at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:52)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
	at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
	at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)

15:18:11.930  WARN [cC3T6zhb] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/stats 500 5ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/stats
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.OperationAuditLogController
           Method = com.xuekairui.user.controller.OperationAuditLogController#getStats(String, LocalDateTime, LocalDateTime)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MissingServletRequestParameterException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 500
    Error message = null
          Headers = [X-Request-Id:"cC3T6zhb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":500,"message":"系统繁忙，请稍后重试","data":null,"timestamp":1782976691929}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:11.933 DEBUG [LHTz3ACk] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/stats?module=USER | IP: 127.0.0.1
15:18:11.934  WARN [LHTz3ACk] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/stats?module=USER 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/stats
       Parameters = {module=[USER]}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"LHTz3ACk", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976691933}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.346 s -- in 操作审计日志接口测试
[INFO] Running 支付模块接口测试
15:18:11.938  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.PaymentControllerTest]: PaymentControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:11.940  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.PaymentControllerTest
15:18:14.899 DEBUG [KbgqtCF9] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/payment/plans | IP: 127.0.0.1
15:18:14.900 DEBUG [KbgqtCF9] [] [        main] c.x.p.m.P.selectList           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE (status = ?) ORDER BY sort_order ASC
15:18:14.900 DEBUG [KbgqtCF9] [] [        main] c.x.p.m.P.selectList           : ==> Parameters: 1(Integer)
15:18:14.902 DEBUG [KbgqtCF9] [] [        main] c.x.p.m.P.selectList           : <==      Total: 2
15:18:14.904 DEBUG [KbgqtCF9] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/payment/plans 200 5ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/payment/plans
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.PaymentController
           Method = com.xuekairui.payment.controller.PaymentController#getPlans()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"KbgqtCF9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"planName":"高级会员·月卡","planCode":"MONTHLY_PRO","membershipLevel":"PRO","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9（原价59.9）","tag":"省50%","sortOrder":3},{"id":2,"planName":"高级会员·年卡","planCode":"YEARLY_PRO","membershipLevel":"PRO","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9（原价599.9）","tag":"省50%","sortOrder":4}],"timestamp":1782976694903}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:14.908 DEBUG [fP8HbJrH] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/payment/plans | IP: 127.0.0.1
15:18:14.909 DEBUG [fP8HbJrH] [] [        main] c.x.p.m.P.selectList           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE (status = ?) ORDER BY sort_order ASC
15:18:14.909 DEBUG [fP8HbJrH] [] [        main] c.x.p.m.P.selectList           : ==> Parameters: 1(Integer)
15:18:14.911 DEBUG [fP8HbJrH] [] [        main] c.x.p.m.P.selectList           : <==      Total: 2
15:18:14.912 DEBUG [fP8HbJrH] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/payment/plans 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/payment/plans
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.PaymentController
           Method = com.xuekairui.payment.controller.PaymentController#getPlans()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"fP8HbJrH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"planName":"高级会员·月卡","planCode":"MONTHLY_PRO","membershipLevel":"PRO","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9（原价59.9）","tag":"省50%","sortOrder":3},{"id":2,"planName":"高级会员·年卡","planCode":"YEARLY_PRO","membershipLevel":"PRO","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9（原价599.9）","tag":"省50%","sortOrder":4}],"timestamp":1782976694911}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:14.917 DEBUG [AJ6tRG7H] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/create | IP: 127.0.0.1
15:18:14.918 DEBUG [AJ6tRG7H] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:14.918 DEBUG [AJ6tRG7H] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:14.920 DEBUG [AJ6tRG7H] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:14.924 DEBUG [AJ6tRG7H] [1] [        main] c.x.p.m.P.selectById           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
15:18:14.924 DEBUG [AJ6tRG7H] [1] [        main] c.x.p.m.P.selectById           : ==> Parameters: 1(Long)
15:18:14.926 DEBUG [AJ6tRG7H] [1] [        main] c.x.p.m.P.selectById           : <==      Total: 1
15:18:15.045 DEBUG [AJ6tRG7H] [1] [        main] c.x.p.m.P.insert               : ==>  Preparing: INSERT INTO t_payment_order ( id, order_no, user_id, plan_id, amount, channel, status, qr_code_url, order_type, expire_time, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:15.046 DEBUG [AJ6tRG7H] [1] [        main] c.x.p.m.P.insert               : ==> Parameters: 2072580594351415297(Long), OP2072580594017112064(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PENDING(String), MOCK_PAY:OP2072580594017112064(String), NORMAL(String), 2026-07-02T15:33:14.956912600(LocalDateTime), 2026-07-02T15:18:15.045086100(LocalDateTime), 2026-07-02T15:18:15.045086100(LocalDateTime)
15:18:15.049 DEBUG [AJ6tRG7H] [1] [        main] c.x.p.m.P.insert               : <==    Updates: 1
15:18:15.049  INFO [AJ6tRG7H] [1] [        main] c.x.p.s.PaymentOrderService    : 创建支付订单: OP2072580594017112064 用户=1 方案=高级会员·月卡 金额=29.90元 渠道=微信支付
15:18:15.056 DEBUG [AJ6tRG7H] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/create 200 139ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/payment/order/create
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTQsImV4cCI6MTc4MzA2MzA5NH0.8ocGE4QXgZC1q8xB1bNNQV3Mq3FdMzYvvR0t60rEXFHLCxVvbFuNB8XUjJUR0ZlhbsbEsh8eGHlNYFC-EfFHeQ", Content-Length:"31"]
             Body = {"planId":1,"channel":"WECHAT"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.PaymentController
           Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"AJ6tRG7H", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580594017112064","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARrklEQVR4Xu3SQW7kShIE0X//S2v2L5wYRzBZJaFpy4aZR5aa//28vDzAf/7Dy8sJ3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEdoP67+v4msSNl01caXDlYRNqjQ655P4mgtq76v4moRNV01c6XAlYZMqjc75JL7mgtr7Kr4mYdNVE1c6XEnYpEqjcz6Jr7mg9r6Kr0nYdNXElQ5XEjap0uicT+JrLqi9r+JrEjZdNXGlw5WETao0OueT+JoLau+r+JqETVdNXOlwJWGTKo3O+SS+5oLaG2icw0vbW650OzZP4u10XaNzTuGl+lbtDTTO4aXtLVe6HZsn8Xa6rtE5p/BSfav2Bhrn8NL2livdjs2TeDtd1+icU3ipvlV7A41zeGl7y5Vux+ZJvJ2ua3TOKbxU36q9gcY5vLS95Uq3Y/Mk3k7XNTrnFF6qb9XeQOMcXtrecqXbsXkSb6frGp1zCi/Vt2pvoJGcBlfSjkZyJjap0jjnNLjS7dikSqPDlbSjcUHtDTSS0+BK2tFIzsQmVRrnnAZXuh2bVGl0uJJ2NC6ovYFGchpcSTsayZnYpErjnNPgSrdjkyqNDlfSjsYFtTfQSE6DK2lHIzkTm1RpnHMaXOl2bFKl0eFK2tG4oPYGGslpcCXtaCRnYpMqjXNOgyvdjk2qNDpcSTsaF9TeQCM5Da6kHY3kTGxSpXHOaXCl27FJlUaHK2lH44LaG2gkp8GVtKORnAZX0o5GciY2CZtUaZxzGlxJOxoX1N5AIzkNrqQdjeQ0uJJ2NJIzsUnYpErjnNPgStrRuKD2BhrJaXAl7Wgkp8GVtKORnIlNwiZVGuecBlfSjsYFtTfQSE6DK2lHIzkNrqQdjeRMbBI2qdI45zS4knY0Lqi9gUZyGlxJOxrJaXAl7WgkZ2KTsEmVxjmnwZW0o3FB7Q00ktPgStrRSE6DK2lHIzkTm4RNqjTOOQ2upB2NC2pvoJGcBlfSjkbnTGwSNgmbhE2qNDpcSTsaHa6kHY0Lam+gkZwGV9KORudMbBI2CZuETao0OlxJOxodrqQdjQtqb6CRnAZX0o5G50xsEjYJm4RNqjQ6XEk7Gh2upB2NC2pvoJGcBlfSjkbnTGwSNgmbhE2qNDpcSTsaHa6kHY0Lam+gkZwGV9KORudMbBI2CZuETao0OlxJOxodrqQdjQtqb6CRnAZX0o5G50xsEjYJm4RNqjQ6XEk7Gh2upB2NC2pvoHEOL6VbGk86O9zd4m5a1jiHl+pbtTfQOIeX0i2NJ50d7m5xNy1rnMNL9a3aG2icw0vplsaTzg53t7ibljXO4aX6Vu0NNM7hpXRL40lnh7tb3E3LGufwUn2r9gYa5/BSuqXxpLPD3S3upmWNc3ipvlV7A41zeCnd0njS2eHuFnfTssY5vFTfqr2v4mvSezT+JeeT+JoLau+r+Jr0Ho1/yfkkvuaC2vsqvia9R+Nfcj6Jr7mg9r6Kr0nv0fiXnE/iay6ova/ia9J7NP4l55P4mgtq76v4mvQejX/J+SS+5oLW+234c7sfbHOu0kjOxKar/gR/9Zf4H9L9l9icqzSSM7Hpqj/BX/0l/od0/yU25yqN5ExsuupP8Fd/if8h3X+JzblKIzkTm676E/zVX+J/SPdfYnOu0kjOxKar/gR/9Zf4H9L9l9icqzSSM7Hpqj9B+0v8A6Q/gcY5vJSwSZVGcna4m5Y1zjmn8NIN2i2fkB6hcQ4vJWxSpZGcHe6mZY1zzim8dIN2yyekR2icw0sJm1RpJGeHu2lZ45xzCi/doN3yCekRGufwUsImVRrJ2eFuWtY455zCSzdot3xCeoTGObyUsEmVRnJ2uJuWNc45p/DSDdotn5AeoXEOLyVsUqWRnB3upmWNc84pvHSDo1sDjS3upmWNc06DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf98PSSE6DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf98PSSE6DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf/sNyPh3QSE6DKwmbhM22eg5vd9dttlWDK/VO7Q00OqfBlYRNwmZbPYe3u+s226rBlXqn9gYandPgSsImYbOtnsPb3XWbbdXgSr1TewONzmlwJWGTsNlWz+Ht7rrNtmpwpd6pvYFG5zS4krBJ2Gyr5/B2d91mWzW4Uu/U3kCjcxpcSdgkbLbVc3i7u26zrRpcqXdab+LBhM22anAl7Wh0uJJ2NDpc6XZsOlxJ2HRV5EZZYLOtGlxJOxodrqQdjQ5Xuh2bDlcSNl0VuVEW2GyrBlfSjkaHK2lHo8OVbsemw5WETVdFbpQFNtuqwZW0o9HhStrR6HCl27HpcCVh01WRG2WBzbZqcCXtaHS4knY0Olzpdmw6XEnYdFXkRllgs60aXEk7Gh2upB2NDle6HZsOVxI2XRW5URbYpEojOQ2upB2NrTOxSZVGhytpR6NzJjY32G/5qIRNqjSS0+BK2tHYOhObVGl0uJJ2NDpnYnOD/ZaPStikSiM5Da6kHY2tM7FJlUaHK2lHo3MmNjfYb/mohE2qNJLT4Era0dg6E5tUaXS4knY0Omdic4P9lo9K2KRKIzkNrqQdja0zsUmVRocraUejcyY2N9hv+aiETao0ktPgStrR2DoTm1RpdLiSdjQ6Z2Jzg5NbEx+esHkSbydsEjYJmy3udriSdjSO8vB6gc2TeDthk7BJ2Gxxt8OVtKNxlIfXC2yexNsJm4RNwmaLux2upB2Nozy8XmDzJN5O2CRsEjZb3O1wJe1oHOXh9QKbJ/F2wiZhk7DZ4m6HK2lH4ygPrxfYPIm3EzYJm4TNFnc7XEk7Gkdp133UFncTNqnSSNh8Fl+TsNlWE5uumrhS79TeIdxN2KRKI2HzWXxNwmZbTWy6auJKvVN7h3A3YZMqjYTNZ/E1CZttNbHpqokr9U7tHcLdhE2qNBI2n8XXJGy21cSmqyau1Du1dwh3Ezap0kjYfBZfk7DZVhObrpq4Uu/U3iHcTdikSiNh81l8TcJmW01sumriSr3Teg0+oX7E/8XdtKzRORObVGl0zsRmWzW40u3Y1OzLiY+68SxwNy1rdM7EJlUanTOx2VYNrnQ7NjX7cuKjbjwL3E3LGp0zsUmVRudMbLZVgyvdjk3Nvpz4qBvPAnfTskbnTGxSpdE5E5tt1eBKt2NTsy8nPurGs8DdtKzRORObVGl0zsRmWzW40u3Y1OzLiY+68SxwNy1rdM7EJlUanTOx2VYNrnQ7NjVt6cGETao0kjOx+Zv4q7rfZdNVE1cSNjdot3xCwiZVGsmZ2PxN/FXd77LpqokrCZsbtFs+IWGTKo3kTGz+Jv6q7nfZdNXElYTNDdotn5CwSZVGciY2fxN/Vfe7bLpq4krC5gbtlk9I2KRKIzkTm7+Jv6r7XTZdNXElYXODdssnJGxSpZGcic3fxF/V/S6brpq4krC5QbvlE7pH2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BIzsQmYZOwSdgkbLpq4sp2p8FL6ZZG50xsuurn/bBsumriynanwUvplkbnTGy66uf9sGy6auLKdqfBS+mWRudMbLrq5/2wbLpq4sp2p8FL6ZZG50xsuurn/bBsumriynanwUvplkbnTGy66uf9sGy6auLKdqfBS+mWRudMbLrq5+yHNbHpqh1e6m7ZJGxSpdHhSrdjkyqNDldu0G75hO4RNl21w0vdLZuETao0OlzpdmxSpdHhyg3aLZ/QPcKmq3Z4qbtlk7BJlUaHK92OTao0Oly5QbvlE7pH2HTVDi91t2wSNqnS6HCl27FJlUaHKzdot3xC9wibrtrhpe6WTcImVRodrnQ7NqnS6HDlBu2WT+geYdNVO7zU3bJJ2KRKo8OVbscmVRodrtyg3fIJ6REaCZuETao0zuGl7pZNwiZVGt/G99W0pQfTSY2ETcImVRrn8FJ3yyZhkyqNb+P7atrSg+mkRsImYZMqjXN4qbtlk7BJlca38X01benBdFIjYZOwSZXGObzU3bJJ2KRK49v4vpq29GA6qZGwSdikSuMcXupu2SRsUqXxbXxfTVt6MJ3USNgkbFKlcQ4vdbdsEjap0vg2vq9mX34X/wDdn8CmqyauJGwSNgmbDlcSNqnSqNmX38U/QPcnsOmqiSsJm4RNwqbDlYRNqjRq9uV38Q/Q/QlsumriSsImYZOw6XAlYZMqjZp9+V38A3R/ApuumriSsEnYJGw6XEnYpEqjZl9+F/8A3Z/ApqsmriRsEjYJmw5XEjap0qjZl9/FP0D3J7DpqokrCZuETcKmw5WETao0atrSg5/F13wb37fF3bSssXUmNkdp133UZ/E138b3bXE3LWtsnYnNUdp1H/VZfM238X1b3E3LGltnYnOUdt1HfRZf82183xZ307LG1pnYHKVd91Gfxdd8G9+3xd20rLF1JjZHadd91GfxNd/G921xNy1rbJ2JzVHadR/15LO8lG5pJGdi82TV4G7CpsOVbscmYXNB7Q00zuGldEsjORObJ6sGdxM2Ha50OzYJmwtqb6BxDi+lWxrJmdg8WTW4m7DpcKXbsUnYXFB7A41zeCnd0kjOxObJqsHdhE2HK92OTcLmgtobaJzDS+mWRnImNk9WDe4mbDpc6XZsEjYX1N5A4xxeSrc0kjOxebJqcDdh0+FKt2OTsLmg9gYayWlwJe1obJ0GVxI2qdJI2HTVDi8lbBI2F9TeQCM5Da6kHY2t0+BKwiZVGgmbrtrhpYRNwuaC2htoJKfBlbSjsXUaXEnYpEojYdNVO7yUsEnYXFB7A43kNLiSdjS2ToMrCZtUaSRsumqHlxI2CZsLam+gkZwGV9KOxtZpcCVhkyqNhE1X7fBSwiZhc0HtDTSS0+BK2tHYOg2uJGxSpZGw6aodXkrYJGwuqL2BRnIaXEk7GslpcCVhk7BJlUZyGlxJ2HS4cpR23UelZ2l0uJJ2NJLT4ErCJmGTKo3kNLiSsOlw5Sjtuo9Kz9LocCXtaCSnwZWETcImVRrJaXAlYdPhylHadR+VnqXR4Ura0UhOgysJm4RNqjSS0+BKwqbDlaO06z4qPUujw5W0o5GcBlcSNgmbVGkkp8GVhE2HK0dp131UepZGhytpRyM5Da4kbBI2qdJIToMrCZsOV47Srvuo9CyNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UH00mNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UH00mNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UHb5z8v3jps7caXDmHlxI226rBlXqn9gYa5/DSZ281uHIOLyVstlWDK/VO7Q00zuGlz95qcOUcXkrYbKsGV+qd2htonMNLn73V4Mo5vJSw2VYNrtQ7tTfQOIeXPnurwZVzeClhs60aXKl3am+gcQ4vffZWgyvn8FLCZls1uFLv1N5X8TXde2xSpZGwSdgkbLpq4soWd4/Srvuoz+JruvfYpEojYZOwSdh01cSVLe4epV33UZ/F13TvsUmVRsImYZOw6aqJK1vcPUq77qM+i6/p3mOTKo2ETcImYdNVE1e2uHuUdt1HfRZf073HJlUaCZuETcKmqyaubHH3KO26j/osvqZ7j02qNBI2CZuETVdNXNni7lGeXX/5Z3k/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR/gfYWtF3xw1oioAAAAASUVORK5CYII=","payUrl":null,"expireTime":"2026-07-02 15:33:14","expireHint":"请在15分钟内完成付款，超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695055}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.065 DEBUG [E4EdmcY4] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/create | IP: 127.0.0.1
15:18:15.066 DEBUG [E4EdmcY4] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:15.066 DEBUG [E4EdmcY4] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:15.068 DEBUG [E4EdmcY4] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:15.070 DEBUG [E4EdmcY4] [1] [        main] c.x.p.m.P.selectById           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
15:18:15.071 DEBUG [E4EdmcY4] [1] [        main] c.x.p.m.P.selectById           : ==> Parameters: 1(Long)
15:18:15.073 DEBUG [E4EdmcY4] [1] [        main] c.x.p.m.P.selectById           : <==      Total: 1
15:18:15.094 DEBUG [E4EdmcY4] [1] [        main] c.x.p.m.P.insert               : ==>  Preparing: INSERT INTO t_payment_order ( id, order_no, user_id, plan_id, amount, channel, status, qr_code_url, order_type, expire_time, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:15.094 DEBUG [E4EdmcY4] [1] [        main] c.x.p.m.P.insert               : ==> Parameters: 2072580594540158977(Long), OP2072580594507845632(String), 1(Long), 1(Long), 29.90(BigDecimal), ALIPAY(String), PENDING(String), MOCK_PAY:OP2072580594507845632(String), NORMAL(String), 2026-07-02T15:33:15.073106500(LocalDateTime), 2026-07-02T15:18:15.093688800(LocalDateTime), 2026-07-02T15:18:15.093688800(LocalDateTime)
15:18:15.098 DEBUG [E4EdmcY4] [1] [        main] c.x.p.m.P.insert               : <==    Updates: 1
15:18:15.098  INFO [E4EdmcY4] [1] [        main] c.x.p.s.PaymentOrderService    : 创建支付订单: OP2072580594507845632 用户=1 方案=高级会员·月卡 金额=29.90元 渠道=支付宝
15:18:15.104 DEBUG [E4EdmcY4] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/create 200 39ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/payment/order/create
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"31"]
             Body = {"planId":1,"channel":"ALIPAY"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.PaymentController
           Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"E4EdmcY4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580594507845632","planName":"高级会员·月卡","amount":29.90,"channel":"ALIPAY","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAR1klEQVR4Xu3SwY7jypIE0fv/P63Zn3C+cYSSVDeatiyYeWQJ/O/z8nID//mHl5cTvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbQf1n8/xdek92gk5z68nbBJlUbnPImvuaD2foqvSe/RSM59eDthkyqNznkSX3NB7f0UX5Peo5Gc+/B2wiZVGp3zJL7mgtr7Kb4mvUcjOffh7YRNqjQ650l8zQW191N8TXqPRnLuw9sJm1RpdM6T+JoLau+n+Jr0Ho3k3Ie3Ezap0uicJ/E1F9TeQOMcXkq3NBI2XTVxJWHTVTu89Efeqr2Bxjm8lG5pJGy6auJKwqardnjpj7xVewONc3gp3dJI2HTVxJWETVft8NIfeav2Bhrn8FK6pZGw6aqJKwmbrtrhpT/yVu0NNM7hpXRLI2HTVRNXEjZdtcNLf+St2htonMNL6ZZGwqarJq4kbLpqh5f+yFu1N9BIToMraUcjYdPhyhZ307JGchpcSTsaHa6kHY0Lam+gkZwGV9KORsKmw5Ut7qZljeQ0uJJ2NDpcSTsaF9TeQCM5Da6kHY2ETYcrW9xNyxrJaXAl7Wh0uJJ2NC6ovYFGchpcSTsaCZsOV7a4m5Y1ktPgStrR6HAl7WhcUHsDjeQ0uJJ2NBI2Ha5scTctaySnwZW0o9HhStrRuKD2BhrJaXAl7WgkbDpc2eJuWtZIToMraUejw5W0o3FB7Q00ktPgStrR6JyJzbaa2GxxNy1rdE6DK2lH44LaG2gkp8GVtKPRORObbTWx2eJuWtbonAZX0o7GBbU30EhOgytpR6NzJjbbamKzxd20rNE5Da6kHY0Lam+gkZwGV9KORudMbLbVxGaLu2lZo3MaXEk7GhfU3kAjOQ2upB2NzpnYbKuJzRZ307JG5zS4knY0Lqi9gUZyGlxJOxqdM7HZVhObLe6mZY3OaXAl7WhcUHsDjeQ0uJJ2NDpcSTsa55wGV9KOxtZpcCXtaFxQewON5DS4knY0OlxJOxrnnAZX0o7G1mlwJe1oXFB7A43kNLiSdjQ6XEk7GuecBlfSjsbWaXAl7WhcUHsDjeQ0uJJ2NDpcSTsa55wGV9KOxtZpcCXtaFxQewON5DS4knY0OlxJOxrnnAZX0o7G1mlwJe1oXFB7A43kNLiSdjQ6XEk7GuecBlfSjsbWaXAl7WhcUHsDjXN4qbtlkyqNDlfO7UxsUqWRnFN4qb5VewONc3ipu2WTKo0OV87tTGxSpZGcU3ipvlV7A41zeKm7ZZMqjQ5Xzu1MbFKlkZxTeKm+VXsDjXN4qbtlkyqNDlfO7UxsUqWRnFN4qb5VewONc3ipu2WTKo0OV87tTGxSpZGcU3ipvlV7A41zeKm7ZZMqjQ5Xzu1MbFKlkZxTeKm+VXs/xdek92j8S86T+JoLau+n+Jr0Ho1/yXkSX3NB7f0UX5Peo/EvOU/iay6ovZ/ia9J7NP4l50l8zQW191N8TXqPxr/kPImvuaD2foqvSe/R+JecJ/E1F7Ten4b/bvqHNRI2Ha7cibf/Ev7adw80kjOx6XDlTrz9l/DXvnugkZyJTYcrd+Ltv4S/9t0DjeRMbDpcuRNv/yX8te8eaCRnYtPhyp14+y/hr333QCM5E5sOV+7E238J7bv9d9M/rJGw6aqJKwmbVGkkbFKl0eFKwiZVGgmbVGkkbC6ovYFGciY2XTVxJWGTKo2ETao0OlxJ2KRKI2GTKo2EzQW1N9BIzsSmqyauJGxSpZGwSZVGhysJm1RpJGxSpZGwuaD2BhrJmdh01cSVhE2qNBI2qdLocCVhkyqNhE2qNBI2F9TeQCM5E5uumriSsEmVRsImVRodriRsUqWRsEmVRsLmgtobaCRnYtNVE1cSNqnSSNikSqPDlYRNqjQSNqnSSNhc0HoTD25xN2HT4Ura0UhOgysJm1RpJGwSNgmbhE1Xfd4PSyM5Da4kbFKlkbBJ2CRsEjZd9Xk/LI3kNLiSsEmVRsImYZOwSdh01ef9sDSS0+BKwiZVGgmbhE3CJmHTVZ/3w9JIToMrCZtUaSRsEjYJm4RNV33eD0sjOQ2uJGxSpZGwSdgkbBI2XfX55sNq8FHds2wSNufwUnfLpqt+iy/ucOWC1tvho7pn2SRszuGl7pZNV/0WX9zhygWtt8NHdc+ySdicw0vdLZuu+i2+uMOVC1pvh4/qnmWTsDmHl7pbNl31W3xxhysXtN4OH9U9yyZhcw4vdbdsuuq3+OIOVy5ovR0+qnuWTcLmHF7qbtl01W/xxR2uXNB6Ew+mkxodrqQdjS3ubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurTf1jOpwMaHa6kHY1zToMrCZtUaXS4knY0Omdi8wXtlk9Ij9DocCXtaJxzGlxJ2KRKo8OVtKPRORObL2i3fEJ6hEaHK2lH45zT4ErCJlUaHa6kHY3Omdh8QbvlE9IjNDpcSTsa55wGVxI2qdLocCXtaHTOxOYL2i2fkB6h0eFK2tE45zS4krBJlUaHK2lHo3MmNl/QbvmE9AiNDlfSjsY5p8GVhE2qNDpcSTsanTOx+YL9lo/qcGWLu2lZI2GTsEmVRocraUdj6+xwt+aLcoUrW9xNyxoJm4RNqjQ6XEk7Gltnh7s1X5QrXNniblrWSNgkbFKl0eFK2tHYOjvcrfmiXOHKFnfTskbCJmGTKo0OV9KOxtbZ4W7NF+UKV7a4m5Y1EjYJm1RpdLiSdjS2zg53a74oV7iyxd20rJGwSdikSqPDlbSjsXV2uFvzRVlg0+FKwiZhk7BJlUZyGlzpdmxSpZGwSZVGckq+KAtsOlxJ2CRsEjap0khOgyvdjk2qNBI2qdJITskXZYFNhysJm4RNwiZVGslpcKXbsUmVRsImVRrJKfmiLLDpcCVhk7BJ2KRKIzkNrnQ7NqnSSNikSiM5JV+UBTYdriRsEjYJm1RpJKfBlW7HJlUaCZtUaSSn5IuywKbDlYRNwiZhkyqN5DS40u3YpEojYZMqjeSUtKUHu5M2Ha5scbfDlbSjkZyJTao0EjYdrnQ7NjVt6cHupE2HK1vc7XAl7WgkZ2KTKo2ETYcr3Y5NTVt6sDtp0+HKFnc7XEk7GsmZ2KRKI2HT4Uq3Y1PTlh7sTtp0uLLF3Q5X0o5GciY2qdJI2HS40u3Y1LSlB7uTNh2ubHG3w5W0o5GciU2qNBI2Ha50OzY1benB7qRNhytb3O1wJe1oJGdikyqNhE2HK92OTc2+nPio7bNcSdgkbFKl0TkTm1RpJGy2VYMraUejZl9OfNT2Wa4kbBI2qdLonIlNqjQSNtuqwZW0o1GzLyc+avssVxI2CZtUaXTOxCZVGgmbbdXgStrRqNmXEx+1fZYrCZuETao0OmdikyqNhM22anAl7WjU7MuJj9o+y5WETcImVRqdM7FJlUbCZls1uJJ2NGr25cRHbZ/lSsImYZMqjc6Z2KRKI2GzrRpcSTsaNV+UBTbnKo0OV7odm1RpJGdic67SSM6t7O/58ITNuUqjw5VuxyZVGsmZ2JyrNJJzK/t7Pjxhc67S6HCl27FJlUZyJjbnKo3k3Mr+ng9P2JyrNDpc6XZsUqWRnInNuUojObeyv+fDEzbnKo0OV7odm1RpJGdic67SSM6t7O/58ITNuUqjw5VuxyZVGsmZ2JyrNJJzK+09n3nuoe5ucTdhcw4v/fqWRudMbLrq835Yp/DSr29pdM7Epqs+74d1Ci/9+pZG50xsuurzflin8NKvb2l0zsSmqz7vh3UKL/36lkbnTGy66vN+WKfw0q9vaXTOxKarPv2H1eATukfYbKsGV87tTGyexdek92h0Tsm+nPio7lk226rBlXM7E5tn8TXpPRqdU7IvJz6qe5bNtmpw5dzOxOZZfE16j0bnlOzLiY/qnmWzrRpcObczsXkWX5Peo9E5Jfty4qO6Z9lsqwZXzu1MbJ7F16T3aHROyb6c+KjuWTbbqsGVczsTm2fxNek9Gp1T8kU50Ng6E5s78XbCJlUayXkSX5Peo9E5kdabeDCd1Oicic2deDthkyqN5DyJr0nv0eicSOtNPJhOanTOxOZOvJ2wSZVGcp7E16T3aHROpPUmHkwnNTpnYnMn3k7YpEojOU/ia9J7NDon0noTD6aTGp0zsbkTbydsUqWRnCfxNek9Gp0Tab2JB9NJjc6Z2NyJtxM2qdJIzpP4mvQejc6JtN6fhv9u9w/bJGzO4aUOVzpcSdikSqNmX/4Wf4DuJ7BJ2JzDSx2udLiSsEmVRs2+/C3+AN1PYJOwOYeXOlzpcCVhkyqNmn35W/wBup/AJmFzDi91uNLhSsImVRo1+/K3+AN0P4FNwuYcXupwpcOVhE2qNGr25W/xB+h+ApuEzTm81OFKhysJm1Rp1LSlB5/F15x7j7sJm1RpJKfBlbSj0Tk73K1pSw8+i6859x53Ezap0khOgytpR6Nzdrhb05YefBZfc+497iZsUqWRnAZX0o5G5+xwt6YtPfgsvubce9xN2KRKIzkNrqQdjc7Z4W5NW3rwWXzNufe4m7BJlUZyGlxJOxqds8Pdmrb04LP4mnPvcTdhkyqN5DS4knY0OmeHuzVt6cEvTv6/eCnd0kjOxCZVGlvcTcsandPgSsLmKO26j7rzWV5KtzSSM7FJlcYWd9OyRuc0uJKwOUq77qPufJaX0i2N5ExsUqWxxd20rNE5Da4kbI7SrvuoO5/lpXRLIzkTm1RpbHE3LWt0ToMrCZujtOs+6s5neSnd0kjOxCZVGlvcTcsandPgSsLmKO26j7rzWV5KtzSSM7FJlcYWd9OyRuc0uJKwOUq77qPSszQ6XEk7Gh2upB2N5ExsEjYdrpzDSwmbhM0FtTfQSE6DK2lHo8OVtKORnIlNwqbDlXN4KWGTsLmg9gYayWlwJe1odLiSdjSSM7FJ2HS4cg4vJWwSNhfU3kAjOQ2upB2NDlfSjkZyJjYJmw5XzuGlhE3C5oLaG2gkp8GVtKPR4Ura0UjOxCZh0+HKObyUsEnYXFB7A43kNLiSdjQ6XEk7GsmZ2CRsOlw5h5cSNgmbC2pvoJGcBlfSjsbWmdh0uJJ2NDpcSTsaHa50uFLTlh5MJzU6XEk7GltnYtPhStrR6HAl7Wh0uNLhSk1bejCd1OhwJe1obJ2JTYcraUejw5W0o9HhSocrNW3pwXRSo8OVtKOxdSY2Ha6kHY0OV9KORocrHa7UtKUH00mNDlfSjsbWmdh0uJJ2NDpcSTsaHa50uFLTlh5MJzU6XEk7GltnYtPhStrR6HAl7Wh0uNLhSk1bejCd1OhwJe1oJOc+vN3hStrR2DoTm4RNwqarPu+H1eDtDlfSjsbWmdgkbBI2XfV5P6wGb3e4knY0ts7EJmGTsOmqz/thNXi7w5W0o7F1JjYJm4RNV33eD6vB2x2upB2NrTOxSdgkbLrq835YDd7ucCXtaGydiU3CJmHTVZ+zH9YpvNTdsulwJe1o3Im3EzbbqsGVeqf2Bhrn8FJ3y6bDlbSjcSfeTthsqwZX6p3aG2icw0vdLZsOV9KOxp14O2GzrRpcqXdqb6BxDi91t2w6XEk7Gnfi7YTNtmpwpd6pvYHGObzU3bLpcCXtaNyJtxM226rBlXqn9gYa5/BSd8umw5W0o3En3k7YbKsGV+qd2vspvia9R6NzJjZd1eBuWtbocCVh0+FKTVt68Fl8TXqPRudMbLqqwd20rNHhSsKmw5WatvTgs/ia9B6NzpnYdFWDu2lZo8OVhE2HKzVt6cFn8TXpPRqdM7HpqgZ307JGhysJmw5XatrSg8/ia9J7NDpnYtNVDe6mZY0OVxI2Ha7UtKUHn8XXpPdodM7Epqsa3E3LGh2uJGw6XKnZly8v/4P3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX/Ay6DIKLn9Mh8AAAAAElFTkSuQmCC","payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款，超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695103}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.113 DEBUG [YQwLFMWk] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/create | IP: 127.0.0.1
15:18:15.114 DEBUG [YQwLFMWk] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:15.115 DEBUG [YQwLFMWk] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:15.116 DEBUG [YQwLFMWk] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:15.123  WARN [YQwLFMWk] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=2004, message=支持的渠道：WECHAT, ALIPAY
15:18:15.123 DEBUG [YQwLFMWk] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/create 200 10ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/payment/order/create
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"32"]
             Body = {"planId":1,"channel":"INVALID"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.PaymentController
           Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"YQwLFMWk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":2004,"message":"支持的渠道：WECHAT, ALIPAY","data":null,"timestamp":1782976695123}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.129 DEBUG [dqU5Gxsx] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/create | IP: 127.0.0.1
15:18:15.132  WARN [dqU5Gxsx] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/create 401 2ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/payment/order/create
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"31"]
             Body = {"planId":1,"channel":"WECHAT"}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"dqU5Gxsx", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976695131}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.138 DEBUG [KvTpWPUD] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/create | IP: 127.0.0.1
15:18:15.138 DEBUG [KvTpWPUD] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:15.138 DEBUG [KvTpWPUD] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:15.141 DEBUG [KvTpWPUD] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:15.143 DEBUG [KvTpWPUD] [1] [        main] c.x.p.m.P.selectById           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
15:18:15.143 DEBUG [KvTpWPUD] [1] [        main] c.x.p.m.P.selectById           : ==> Parameters: 1(Long)
15:18:15.145 DEBUG [KvTpWPUD] [1] [        main] c.x.p.m.P.selectById           : <==      Total: 1
15:18:15.155 DEBUG [KvTpWPUD] [1] [        main] c.x.p.m.P.insert               : ==>  Preparing: INSERT INTO t_payment_order ( id, order_no, user_id, plan_id, amount, channel, status, qr_code_url, order_type, expire_time, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:15.155 DEBUG [KvTpWPUD] [1] [        main] c.x.p.m.P.insert               : ==> Parameters: 2072580594796011522(Long), OP2072580594814029824(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PENDING(String), MOCK_PAY:OP2072580594814029824(String), NORMAL(String), 2026-07-02T15:33:15.146155900(LocalDateTime), 2026-07-02T15:18:15.155197400(LocalDateTime), 2026-07-02T15:18:15.155197400(LocalDateTime)
15:18:15.159 DEBUG [KvTpWPUD] [1] [        main] c.x.p.m.P.insert               : <==    Updates: 1
15:18:15.159  INFO [KvTpWPUD] [1] [        main] c.x.p.s.PaymentOrderService    : 创建支付订单: OP2072580594814029824 用户=1 方案=高级会员·月卡 金额=29.90元 渠道=微信支付
15:18:15.165 DEBUG [KvTpWPUD] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/create 200 27ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/payment/order/create
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"31"]
             Body = {"planId":1,"channel":"WECHAT"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.PaymentController
           Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"KvTpWPUD", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580594814029824","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARVUlEQVR4Xu3SQZLjSnAE0X//S7f2LwOmsESBFDXw5Zh7ZHEa//29vDzAf/7Dy8sJ3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEdoP67+v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7GltnYpOwSdgkbFKlcc5pcCXtaFxQewON5DS4knY0ts7EJmGTsEnYpErjnNPgStrRuKD2BhrJaXAl7WhsnYlNwiZhk7BJlcY5p8GVtKNxQe0NNJLT4Era0dg6E5uETcImYZMqjXNOgytpR+OC2htoJKfBlbSjsXUmNgmbhE3CJlUa55wGV9KOxgW1N9BIToMraUdj60xsEjYJm4RNqjTOOQ2upB2NC2pvoJGcBlfSjkZyTuGlhE3CJlUaHa6kHY0OV9KOxgW1N9BIToMraUcjOafwUsImYZMqjQ5X0o5GhytpR+OC2htoJKfBlbSjkZxTeClhk7BJlUaHK2lHo8OVtKNxQe0NNJLT4Era0UjOKbyUsEnYpEqjw5W0o9HhStrRuKD2BhrJaXAl7Wgk5xReStgkbFKl0eFK2tHocCXtaFxQewON5DS4knY0knMKLyVsEjap0uhwJe1odLiSdjQuqL2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2v4mvSezT+JeeT+JoLau+r+Jr0Ho1/yfkkvuaC2vsqvia9R+Nfcj6Jr7mg9r6Kr0nv0fiXnE/iay6ova/ia9J7NP4l55P4mgtq76v4mvQejX/J+SS+5oLW+7+GP7f+wQu8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT/Br/4S/yBP/km8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT9B+0v8D0j/BRrn8FLCJmFzDi+lWxrnnFN46Qbtlk9Ij9A4h5cSNgmbc3gp3dI455zCSzdot3xCeoTGObyUsEnYnMNL6ZbGOecUXrpBu+UT0iM0zuGlhE3C5hxeSrc0zjmn8NIN2i2fkB6hcQ4vJWwSNufwUrqlcc45hZdu0G75hPQIjXN4KWGTsDmHl9ItjXPOKbx0g3bLJ6RHaHS4krBJ2CRszuGlLe4mbBI2CZuETVf9vR/WKby0xd2ETcImYZOw6aq/98M6hZe2uJuwSdgkbBI2XfX3flin8NIWdxM2CZuETcKmq/7eD+sUXtribsImYZOwSdh01d/7YZ3CS1vcTdgkbBI2CZuu+rvzYU1sUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLDyZsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLD6aTGk/i7YRNV01cSdicw0vplkbnTGxu0G75hPQIjSfxdsKmqyauJGzO4aV0S6NzJjY3aLd8QnqExpN4O2HTVRNXEjbn8FK6pdE5E5sbtFs+IT1C40m8nbDpqokrCZtzeCnd0uicic0N2i2fkB6h8STeTth01cSVhM05vJRuaXTOxOYG7ZZPSI/QeBJvJ2y6auJKwuYcXkq3NDpnYnODdssnpEdoJGeHuwmbVGlscTdhkyqNhE2HK2lH4yjtuo9Kz9JIzg53Ezap0tjibsImVRoJmw5X0o7GUdp1H5WepZGcHe4mbFKlscXdhE2qNBI2Ha6kHY2jtOs+Kj1LIzk73E3YpEpji7sJm1RpJGw6XEk7Gkdp131UepZGcna4m7BJlcYWdxM2qdJI2HS4knY0jtKu+6j0LI3k7HA3YZMqjS3uJmxSpZGw6XAl7WgcZb/uM9NDNba4m5Y1zjk73E3YbKuJTVdNXKl3Wm/iwXRSY4u7aVnjnLPD3YTNtprYdNXElXqn9SYeTCc1tribljXOOTvcTdhsq4lNV01cqXdab+LBdFJji7tpWeOcs8PdhM22mth01cSVeqf1Jh5MJzW2uJuWNc45O9xN2GyriU1XTVypd1pv4sF0UmOLu2lZ45yzw92Ezbaa2HTVxJV6p/UmHqxPLvBSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKAca5/BSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKP9f4K96Em931226auJKwuYG+y0f9Zv4q57E2911m66auJKwucF+y0f9Jv6qJ/F2d92mqyauJGxusN/yUb+Jv+pJvN1dt+mqiSsJmxvst3zUb+KvehJvd9dtumriSsLmBvstH/Wb+KuexNvddZuumriSsLlBu+UTto9wJWHzJN7e4m7C5slq4kra0UjYXFB7A40OVxI2T+LtLe4mbJ6sJq6kHY2EzQW1N9DocCVh8yTe3uJuwubJauJK2tFI2FxQewONDlcSNk/i7S3uJmyerCaupB2NhM0FtTfQ6HAlYfMk3t7ibsLmyWriStrRSNhcUHsDjQ5XEjZP4u0t7iZsnqwmrqQdjYTNBbU30EhOgyvbnQYvJWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV39kPq8GVbsemqxrcTdikSqPDlW7HJlUaHa7coN3yCdtHuNLt2HRVg7sJm1RpdLjS7dikSqPDlRu0Wz5h+whXuh2brmpwN2GTKo0OV7odm1RpdLhyg3bLJ2wf4Uq3Y9NVDe4mbFKl0eFKt2OTKo0OV27QbvmE7SNc6XZsuqrB3YRNqjQ6XOl2bFKl0eHKDdotn7B9hCvdjk1XNbibsEmVRocr3Y5NqjQ6XLlBu+UT0iM0kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9Xsy+/i/8BCZttNbFJ2HTVxJUOVxI2qdKo2Zffxf+AhM22mtgkbLpq4kqHKwmbVGnU7Mvv4n9AwmZbTWwSNl01caXDlYRNqjRq9uV38T8gYbOtJjYJm66auNLhSsImVRo1+/K7+B+QsNlWE5uETVdNXOlwJWGTKo2affld/A9I2GyriU3CpqsmrnS4krBJlUZNW3rws/iahE3CZou7W9xNyxpbZ2JzlHbdR30WX5OwSdhscXeLu2lZY+tMbI7Srvuoz+JrEjYJmy3ubnE3LWtsnYnNUdp1H/VZfE3CJmGzxd0t7qZlja0zsTlKu+6jPouvSdgkbLa4u8XdtKyxdSY2R2nXfdRn8TUJm4TNFne3uJuWNbbOxOYo7bqPevJZXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00zuGldEsjOQ2upB2N5ExsUqWRsOlwpduxSdhcUHsDjXN4Kd3SSE6DK2lHIzkTm1RpJGw6XOl2bBI2F9TeQOMcXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00ktPgStrR6JyJTcImYXOu0jiHlxI2CZsLam+gkZwGV9KORudMbBI2CZtzlcY5vJSwSdhcUHsDjeQ0uJJ2NDpnYpOwSdicqzTO4aWETcLmgtobaCSnwZW0o9E5E5uETcLmXKVxDi8lbBI2F9TeQCM5Da6kHY3OmdgkbBI25yqNc3gpYZOwuaD2BhrJaXAl7Wh0zsQmYZOwOVdpnMNLCZuEzQW1N9BIToMraUfjSafBlS3uJmwSNh2uHKVd91HpWRodrqQdjSedBle2uJuwSdh0uHKUdt1HpWdpdLiSdjSedBpc2eJuwiZh0+HKUdp1H5WepdHhStrReNJpcGWLuwmbhE2HK0dp131UepZGhytpR+NJp8GVLe4mbBI2Ha4cpV33UelZGh2upB2NJ50GV7a4m7BJ2HS4cpR23UelZ2l0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT144+T/ipeevDXx9va6K92OTcJmWzW4Uu/U3kDjHF568tbE29vrrnQ7NgmbbdXgSr1TewONc3jpyVsTb2+vu9Lt2CRstlWDK/VO7Q00zuGlJ29NvL297kq3Y5Ow2VYNrtQ7tTfQOIeXnrw18fb2uivdjk3CZls1uFLv1N5A4xxeevLWxNvb6650OzYJm23V4Eq9U3tfxdd8+z0T35ew6aqJK1vcPUq77qM+i6/59nsmvi9h01UTV7a4e5R23Ud9Fl/z7fdMfF/Cpqsmrmxx9yjtuo/6LL7m2++Z+L6ETVdNXNni7lHadR/1WXzNt98z8X0Jm66auLLF3aO06z7qs/iab79n4vsSNl01cWWLu0d5dv3ln+X9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuF/ANQkBqB7RoIFAAAAAElFTkSuQmCC","payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款，超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695164}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.166 DEBUG [FprJMeHK] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/payment/order/OP2072580594814029824 | IP: 127.0.0.1
15:18:15.168 DEBUG [FprJMeHK] [1] [        main] c.x.p.m.P.selectByOrderNo      : ==>  Preparing: SELECT * FROM t_payment_order WHERE order_no = ? LIMIT 1
15:18:15.168 DEBUG [FprJMeHK] [1] [        main] c.x.p.m.P.selectByOrderNo      : ==> Parameters: OP2072580594814029824(String)
15:18:15.170 DEBUG [FprJMeHK] [1] [        main] c.x.p.m.P.selectByOrderNo      : <==      Total: 1
15:18:15.171 DEBUG [FprJMeHK] [1] [        main] c.x.p.m.P.selectById           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
15:18:15.171 DEBUG [FprJMeHK] [1] [        main] c.x.p.m.P.selectById           : ==> Parameters: 1(Long)
15:18:15.172 DEBUG [FprJMeHK] [1] [        main] c.x.p.m.P.selectById           : <==      Total: 1
15:18:15.180 DEBUG [FprJMeHK] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/payment/order/OP2072580594814029824 200 14ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/payment/order/OP2072580594814029824
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.PaymentController
           Method = com.xuekairui.payment.controller.PaymentController#queryOrder(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"FprJMeHK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580594814029824","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARVUlEQVR4Xu3SQZLjSnAE0X//S7f2LwOmsESBFDXw5Zh7ZHEa//29vDzAf/7Dy8sJ3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEdoP67+v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7GltnYpOwSdgkbFKlcc5pcCXtaFxQewON5DS4knY0ts7EJmGTsEnYpErjnNPgStrRuKD2BhrJaXAl7WhsnYlNwiZhk7BJlcY5p8GVtKNxQe0NNJLT4Era0dg6E5uETcImYZMqjXNOgytpR+OC2htoJKfBlbSjsXUmNgmbhE3CJlUa55wGV9KOxgW1N9BIToMraUdj60xsEjYJm4RNqjTOOQ2upB2NC2pvoJGcBlfSjkZyTuGlhE3CJlUaHa6kHY0OV9KOxgW1N9BIToMraUcjOafwUsImYZMqjQ5X0o5GhytpR+OC2htoJKfBlbSjkZxTeClhk7BJlUaHK2lHo8OVtKNxQe0NNJLT4Era0UjOKbyUsEnYpEqjw5W0o9HhStrRuKD2BhrJaXAl7Wgk5xReStgkbFKl0eFK2tHocCXtaFxQewON5DS4knY0knMKLyVsEjap0uhwJe1odLiSdjQuqL2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2v4mvSezT+JeeT+JoLau+r+Jr0Ho1/yfkkvuaC2vsqvia9R+Nfcj6Jr7mg9r6Kr0nv0fiXnE/iay6ova/ia9J7NP4l55P4mgtq76v4mvQejX/J+SS+5oLW+7+GP7f+wQu8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT/Br/4S/yBP/km8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT9B+0v8D0j/BRrn8FLCJmFzDi+lWxrnnFN46Qbtlk9Ij9A4h5cSNgmbc3gp3dI455zCSzdot3xCeoTGObyUsEnYnMNL6ZbGOecUXrpBu+UT0iM0zuGlhE3C5hxeSrc0zjmn8NIN2i2fkB6hcQ4vJWwSNufwUrqlcc45hZdu0G75hPQIjXN4KWGTsDmHl9ItjXPOKbx0g3bLJ6RHaHS4krBJ2CRszuGlLe4mbBI2CZuETVf9vR/WKby0xd2ETcImYZOw6aq/98M6hZe2uJuwSdgkbBI2XfX3flin8NIWdxM2CZuETcKmq/7eD+sUXtribsImYZOwSdh01d/7YZ3CS1vcTdgkbBI2CZuu+rvzYU1sUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLDyZsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLD6aTGk/i7YRNV01cSdicw0vplkbnTGxu0G75hPQIjSfxdsKmqyauJGzO4aV0S6NzJjY3aLd8QnqExpN4O2HTVRNXEjbn8FK6pdE5E5sbtFs+IT1C40m8nbDpqokrCZtzeCnd0uicic0N2i2fkB6h8STeTth01cSVhM05vJRuaXTOxOYG7ZZPSI/QeBJvJ2y6auJKwuYcXkq3NDpnYnODdssnpEdoJGeHuwmbVGlscTdhkyqNhE2HK2lH4yjtuo9Kz9JIzg53Ezap0tjibsImVRoJmw5X0o7GUdp1H5WepZGcHe4mbFKlscXdhE2qNBI2Ha6kHY2jtOs+Kj1LIzk73E3YpEpji7sJm1RpJGw6XEk7Gkdp131UepZGcna4m7BJlcYWdxM2qdJI2HS4knY0jtKu+6j0LI3k7HA3YZMqjS3uJmxSpZGw6XAl7WgcZb/uM9NDNba4m5Y1zjk73E3YbKuJTVdNXKl3Wm/iwXRSY4u7aVnjnLPD3YTNtprYdNXElXqn9SYeTCc1tribljXOOTvcTdhsq4lNV01cqXdab+LBdFJji7tpWeOcs8PdhM22mth01cSVeqf1Jh5MJzW2uJuWNc45O9xN2GyriU1XTVypd1pv4sF0UmOLu2lZ45yzw92Ezbaa2HTVxJV6p/UmHqxPLvBSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKAca5/BSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKP9f4K96Em931226auJKwuYG+y0f9Zv4q57E2911m66auJKwucF+y0f9Jv6qJ/F2d92mqyauJGxusN/yUb+Jv+pJvN1dt+mqiSsJmxvst3zUb+KvehJvd9dtumriSsLmBvstH/Wb+KuexNvddZuumriSsLlBu+UTto9wJWHzJN7e4m7C5slq4kra0UjYXFB7A40OVxI2T+LtLe4mbJ6sJq6kHY2EzQW1N9DocCVh8yTe3uJuwubJauJK2tFI2FxQewONDlcSNk/i7S3uJmyerCaupB2NhM0FtTfQ6HAlYfMk3t7ibsLmyWriStrRSNhcUHsDjQ5XEjZP4u0t7iZsnqwmrqQdjYTNBbU30EhOgyvbnQYvJWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV39kPq8GVbsemqxrcTdikSqPDlW7HJlUaHa7coN3yCdtHuNLt2HRVg7sJm1RpdLjS7dikSqPDlRu0Wz5h+whXuh2brmpwN2GTKo0OV7odm1RpdLhyg3bLJ2wf4Uq3Y9NVDe4mbFKl0eFKt2OTKo0OV27QbvmE7SNc6XZsuqrB3YRNqjQ6XOl2bFKl0eHKDdotn7B9hCvdjk1XNbibsEmVRocr3Y5NqjQ6XLlBu+UT0iM0kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9Xsy+/i/8BCZttNbFJ2HTVxJUOVxI2qdKo2Zffxf+AhM22mtgkbLpq4kqHKwmbVGnU7Mvv4n9AwmZbTWwSNl01caXDlYRNqjRq9uV38T8gYbOtJjYJm66auNLhSsImVRo1+/K7+B+QsNlWE5uETVdNXOlwJWGTKo2affld/A9I2GyriU3CpqsmrnS4krBJlUZNW3rws/iahE3CZou7W9xNyxpbZ2JzlHbdR30WX5OwSdhscXeLu2lZY+tMbI7Srvuoz+JrEjYJmy3ubnE3LWtsnYnNUdp1H/VZfE3CJmGzxd0t7qZlja0zsTlKu+6jPouvSdgkbLa4u8XdtKyxdSY2R2nXfdRn8TUJm4TNFne3uJuWNbbOxOYo7bqPevJZXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00zuGldEsjOQ2upB2N5ExsUqWRsOlwpduxSdhcUHsDjXN4Kd3SSE6DK2lHIzkTm1RpJGw6XOl2bBI2F9TeQOMcXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00ktPgStrR6JyJTcImYXOu0jiHlxI2CZsLam+gkZwGV9KORudMbBI2CZtzlcY5vJSwSdhcUHsDjeQ0uJJ2NDpnYpOwSdicqzTO4aWETcLmgtobaCSnwZW0o9E5E5uETcLmXKVxDi8lbBI2F9TeQCM5Da6kHY3OmdgkbBI25yqNc3gpYZOwuaD2BhrJaXAl7Wh0zsQmYZOwOVdpnMNLCZuEzQW1N9BIToMraUfjSafBlS3uJmwSNh2uHKVd91HpWRodrqQdjSedBle2uJuwSdh0uHKUdt1HpWdpdLiSdjSedBpc2eJuwiZh0+HKUdp1H5WepdHhStrReNJpcGWLuwmbhE2HK0dp131UepZGhytpR+NJp8GVLe4mbBI2Ha4cpV33UelZGh2upB2NJ50GV7a4m7BJ2HS4cpR23UelZ2l0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT144+T/ipeevDXx9va6K92OTcJmWzW4Uu/U3kDjHF568tbE29vrrnQ7NgmbbdXgSr1TewONc3jpyVsTb2+vu9Lt2CRstlWDK/VO7Q00zuGlJ29NvL297kq3Y5Ow2VYNrtQ7tTfQOIeXnrw18fb2uivdjk3CZls1uFLv1N5A4xxeevLWxNvb6650OzYJm23V4Eq9U3tfxdd8+z0T35ew6aqJK1vcPUq77qM+i6/59nsmvi9h01UTV7a4e5R23Ud9Fl/z7fdMfF/Cpqsmrmxx9yjtuo/6LL7m2++Z+L6ETVdNXNni7lHadR/1WXzNt98z8X0Jm66auLLF3aO06z7qs/iab79n4vsSNl01cWWLu0d5dv3ln+X9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuF/ANQkBqB7RoIFAAAAAElFTkSuQmCC","payUrl":"MOCK_PAY:OP2072580594814029824","expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款，超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695180}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.188 DEBUG [hN5y3NGr] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/payment/order/OP_NOTEXIST | IP: 127.0.0.1
15:18:15.189 DEBUG [hN5y3NGr] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:15.189 DEBUG [hN5y3NGr] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:15.192 DEBUG [hN5y3NGr] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:15.193 DEBUG [hN5y3NGr] [1] [        main] c.x.p.m.P.selectByOrderNo      : ==>  Preparing: SELECT * FROM t_payment_order WHERE order_no = ? LIMIT 1
15:18:15.193 DEBUG [hN5y3NGr] [1] [        main] c.x.p.m.P.selectByOrderNo      : ==> Parameters: OP_NOTEXIST(String)
15:18:15.195 DEBUG [hN5y3NGr] [1] [        main] c.x.p.m.P.selectByOrderNo      : <==      Total: 0
15:18:15.196  WARN [hN5y3NGr] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=2001, message=支付订单不存在
15:18:15.197 DEBUG [hN5y3NGr] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/payment/order/OP_NOTEXIST 200 9ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/payment/order/OP_NOTEXIST
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.PaymentController
           Method = com.xuekairui.payment.controller.PaymentController#queryOrder(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"hN5y3NGr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":2001,"message":"支付订单不存在","data":null,"timestamp":1782976695196}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.205 DEBUG [P6xhCMXY] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/create | IP: 127.0.0.1
15:18:15.205 DEBUG [P6xhCMXY] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:15.206 DEBUG [P6xhCMXY] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:15.208 DEBUG [P6xhCMXY] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:15.211 DEBUG [P6xhCMXY] [1] [        main] c.x.p.m.P.selectById           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
15:18:15.211 DEBUG [P6xhCMXY] [1] [        main] c.x.p.m.P.selectById           : ==> Parameters: 1(Long)
15:18:15.213 DEBUG [P6xhCMXY] [1] [        main] c.x.p.m.P.selectById           : <==      Total: 1
15:18:15.221 DEBUG [P6xhCMXY] [1] [        main] c.x.p.m.P.insert               : ==>  Preparing: INSERT INTO t_payment_order ( id, order_no, user_id, plan_id, amount, channel, status, qr_code_url, order_type, expire_time, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:15.221 DEBUG [P6xhCMXY] [1] [        main] c.x.p.m.P.insert               : ==> Parameters: 2072580595118972929(Long), OP2072580595095048192(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PENDING(String), MOCK_PAY:OP2072580595095048192(String), NORMAL(String), 2026-07-02T15:33:15.213451100(LocalDateTime), 2026-07-02T15:18:15.220602200(LocalDateTime), 2026-07-02T15:18:15.220602200(LocalDateTime)
15:18:15.224 DEBUG [P6xhCMXY] [1] [        main] c.x.p.m.P.insert               : <==    Updates: 1
15:18:15.224  INFO [P6xhCMXY] [1] [        main] c.x.p.s.PaymentOrderService    : 创建支付订单: OP2072580595095048192 用户=1 方案=高级会员·月卡 金额=29.90元 渠道=微信支付
15:18:15.229 DEBUG [P6xhCMXY] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/create 200 24ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/payment/order/create
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"31"]
             Body = {"planId":1,"channel":"WECHAT"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.PaymentController
           Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"P6xhCMXY", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580595095048192","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAR2klEQVR4Xu3SQW4kSxID0X//S2v2z5kAxxWhEtRpy4YZPUqd/329vFzgP//h5eUE74f1coX3w3q5wvthvVzh/bBervB+WC9XeD+slyu8H9bLFd4P6+UK74f1coX3w3q5wvthvVyh/bD++yi+psOVbsfmZrXDSz+Lr3mg9j6Kr+lwpduxuVnt8NLP4mseqL2P4ms6XOl2bG5WO7z0s/iaB2rvo/iaDle6HZub1Q4v/Sy+5oHa+yi+psOVbsfmZrXDSz+Lr3mg9j6Kr+lwpduxuVnt8NLP4mseqL2Bxjm8lG5pnMNL21uuJGwSNqnSOIeX6lu1N9A4h5fSLY1zeGl7y5WETcImVRrn8FJ9q/YGGufwUrqlcQ4vbW+5krBJ2KRK4xxeqm/V3kDjHF5KtzTO4aXtLVcSNgmbVGmcw0v1rdobaJzDS+mWxjm8tL3lSsImYZMqjXN4qb5VewONc3gp3dI4h5e2t1xJ2CRsUqVxDi/Vt2pvoJGcBlfSjkbCJmGTsEnYpEojYZOwSZVGchpcSTsaD9TeQCM5Da6kHY2ETcImYZOwSZVGwiZhkyqN5DS4knY0Hqi9gUZyGlxJOxoJm4RNwiZhkyqNhE3CJlUayWlwJe1oPFB7A43kNLiSdjQSNgmbhE3CJlUaCZuETao0ktPgStrReKD2BhrJaXAl7WgkbBI2CZuETao0EjYJm1RpJKfBlbSj8UDtDTSS0+BK2tFI2CRsEjYJm1RpJGwSNqnSSE6DK2lH44HaG2gkp8GVtKORsEnYJGw6XEk7GsmZ2KRKIzkNrqQdjQdqb6CRnAZX0o5GwiZhk7DpcCXtaCRnYpMqjeQ0uJJ2NB6ovYFGchpcSTsaCZuETcKmw5W0o5GciU2qNJLT4Era0Xig9gYayWlwJe1oJGwSNgmbDlfSjkZyJjap0khOgytpR+OB2htoJKfBlbSjkbBJ2CRsOlxJOxrJmdikSiM5Da6kHY0Ham+gkZwGV9KORsImYZOw6XAl7WgkZ2KTKo3kNLiSdjQeqL2BRnIaXEk7GlunwZW0o9HhStrROOc0uJJ2NB6ovYFGchpcSTsaW6fBlbSj0eFK2tE45zS4knY0Hqi9gUZyGlxJOxpbp8GVtKPR4Ura0TjnNLiSdjQeqL2BRnIaXEk7GlunwZW0o9HhStrROOc0uJJ2NB6ovYFGchpcSTsaW6fBlbSj0eFK2tE45zS4knY0Hqi9gUZyGlxJOxpbp8GVtKPR4Ura0TjnNLiSdjQeqL2Bxjm81N2y6aqJK9udHd5O1zWScwov1bdqb6BxDi91t2y6auLKdmeHt9N1jeScwkv1rdobaJzDS90tm66auLLd2eHtdF0jOafwUn2r9gYa5/BSd8umqyaubHd2eDtd10jOKbxU36q9gcY5vNTdsumqiSvbnR3eTtc1knMKL9W3am+gcQ4vdbdsumriynZnh7fTdY3knMJL9a3a+yi+Jr1H419yfhJf80DtfRRfk96j8S85P4mveaD2PoqvSe/R+Jecn8TXPFB7H8XXpPdo/EvOT+JrHqi9j+Jr0ns0/iXnJ/E1D9TeR/E16T0a/5Lzk/iaB1rv38E/ZMImVRqd82f4y79th//5CZtUaXTOn+Ev/7Yd/ucnbFKl0Tl/hr/823b4n5+wSZVG5/wZ/vJv2+F/fsImVRqd82f4y79th//5CZtUaXTOn6H9bf5J0h9F46YzsUmVRsJmW01sumqHl7pbNl0VaUsPppMaN52JTao0EjbbamLTVTu81N2y6apIW3owndS46UxsUqWRsNlWE5uu2uGl7pZNV0Xa0oPppMZNZ2KTKo2Ezbaa2HTVDi91t2y6KtKWHkwnNW46E5tUaSRsttXEpqt2eKm7ZdNVkbb0YDqpcdOZ2KRKI2GzrSY2XbXDS90tm66K7MuJj+pwpcOV7U6DlxI2XbXDS+mWxhZ36+XWa/AJHa50uLLdafBSwqardngp3dLY4m693HoNPqHDlQ5XtjsNXkrYdNUOL6VbGlvcrZdbr8EndLjS4cp2p8FLCZuu2uGldEtji7v1cus1+IQOVzpc2e40eClh01U7vJRuaWxxt15uvQaf0OFKhyvbnQYvJWy6aoeX0i2NLe7Wy7U30EjYpEqjw5VuxyZh01UTVxI2Ha50uNLt2NS0pQe7kzap0uhwpduxSdh01cSVhE2HKx2udDs2NW3pwe6kTao0OlzpdmwSNl01cSVh0+FKhyvdjk1NW3qwO2mTKo0OV7odm4RNV01cSdh0uNLhSrdjU9OWHuxO2qRKo8OVbscmYdNVE1cSNh2udLjS7djUtKUHu5M2qdLocKXbsUnYdNXElYRNhysdrnQ7NjVt6cF0UmPr7HC3W7Y5V2kkbDpc6XZsUqWRnJK29GA6qbF1drjbLducqzQSNh2udDs2qdJITklbejCd1Ng6O9ztlm3OVRoJmw5Xuh2bVGkkp6QtPZhOamydHe52yzbnKo2ETYcr3Y5NqjSSU9KWHkwnNbbODne7ZZtzlUbCpsOVbscmVRrJKWlLD6aTGltnh7vdss25SiNh0+FKt2OTKo3klLSlB7uTNqnSSNgkbLrqFN7eXncl7WgkbFKlkZyJzQO1N9BI2KRKI2GTsOmqU3h7e92VtKORsEmVRnImNg/U3kAjYZMqjYRNwqarTuHt7XVX0o5GwiZVGsmZ2DxQewONhE2qNBI2CZuuOoW3t9ddSTsaCZtUaSRnYvNA7Q00Ejap0kjYJGy66hTe3l53Je1oJGxSpZGcic0DtTfQSNikSiNhk7DpqlN4e3vdlbSjkbBJlUZyJjYP1F6BTcImYZOw2VYNrmx3GrzU3bJJlcZl2ns+M2GTsEnYJGy2VYMr250GL3W3bFKlcZn2ns9M2CRsEjYJm23V4Mp2p8FL3S2bVGlcpr3nMxM2CZuETcJmWzW4st1p8FJ3yyZVGpdp7/nMhE3CJmGTsNlWDa5sdxq81N2ySZXGZdp7PjNhk7BJ2CRstlWDK9udBi91t2xSpXGZ/T0f/rP4mi3upmWNc3ipw5W0o9E5E5uab5QfxddscTcta5zDSx2upB2NzpnY1Hyj/Ci+Zou7aVnjHF7qcCXtaHTOxKbmG+VH8TVb3E3LGufwUocraUejcyY2Nd8oP4qv2eJuWtY4h5c6XEk7Gp0zsan5RvlRfM0Wd9Oyxjm81OFK2tHonIlNTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKzb7c4cPT0zU6XEnYbKsGV9KOxjlnYpMqjYTNA613Cp+ZHqrR4UrCZls1uJJ2NM45E5tUaSRsHmi9U/jM9FCNDlcSNtuqwZW0o3HOmdikSiNh80DrncJnpodqdLiSsNlWDa6kHY1zzsQmVRoJmwda7xQ+Mz1Uo8OVhM22anAl7WiccyY2qdJI2DzQeqfwmemhGh2uJGy2VYMraUfjnDOxSZVGwuaB1pt4MGGTsDlXaZxzJjap0rjpTGwSNgmbB1pv4sGETcLmXKVxzpnYpErjpjOxSdgkbB5ovYkHEzYJm3OVxjlnYpMqjZvOxCZhk7B5oPUmHkzYJGzOVRrnnIlNqjRuOhObhE3C5oHWm3gwYZOwOVdpnHMmNqnSuOlMbBI2CZsHWm/iwYRNwuZcpXHOmdikSuOmM7FJ2CRsHqi9gUaHK+fwUocrCZuEzRZ3EzYJm66auFLTlh7cnnTlHF7qcCVhk7DZ4m7CJmHTVRNXatrSg9uTrpzDSx2uJGwSNlvcTdgkbLpq4kpNW3pwe9KVc3ipw5WETcJmi7sJm4RNV01cqWlLD25PunIOL3W4krBJ2GxxN2GTsOmqiSs1benB7UlXzuGlDlcSNgmbLe4mbBI2XTVxpeYb5UAjYZOwSZXGFne7ZZtUaSRsOlxJ2CRsuqpkv+WjumfZJGxSpbHF3W7ZJlUaCZsOVxI2CZuuKtlv+ajuWTYJm1RpbHG3W7ZJlUbCpsOVhE3CpqtK9ls+qnuWTcImVRpb3O2WbVKlkbDpcCVhk7DpqpL9lo/qnmWTsEmVxhZ3u2WbVGkkbDpcSdgkbLqqZL/lo7pn2SRsUqWxxd1u2SZVGgmbDlcSNgmbrippt3xCeoTGObyUbml0uPL7du7h7YRNV329H5Yrv2/nHt5O2HTV1/thufL7du7h7YRNV329H5Yrv2/nHt5O2HTV1/thufL7du7h7YRNV329H5Yrv2/nHt5O2HTVV/9h/Tb8uekHayRsUqXR4Uq3Y9NVE1e6HZuuiuzLz+IfIP0JNBI2qdLocKXbsemqiSvdjk1XRfblZ/EPkP4EGgmbVGl0uNLt2HTVxJVux6arIvvys/gHSH8CjYRNqjQ6XOl2bLpq4kq3Y9NVkX35WfwDpD+BRsImVRodrnQ7Nl01caXbsemqyL78LP4B0p9AI2GTKo0OV7odm66auNLt2HRVpC09+LP4moTNFnfTskbCJmGTKo2tcwovPVB7H8XXJGy2uJuWNRI2CZtUaWydU3jpgdr7KL4mYbPF3bSskbBJ2KRKY+ucwksP1N5H8TUJmy3upmWNhE3CJlUaW+cUXnqg9j6Kr0nYbHE3LWskbBI2qdLYOqfw0gO191F8TcJmi7tpWSNhk7BJlcbWOYWXHqi9gcY5vHTulrtb3O1wJe1oJKfBlYTNtorU3kDjHF46d8vdLe52uJJ2NJLT4ErCZltFam+gcQ4vnbvl7hZ3O1xJOxrJaXAlYbOtIrU30DiHl87dcneLux2upB2N5DS4krDZVpHaG2icw0vnbrm7xd0OV9KORnIaXEnYbKtI7Q00zuGlc7fc3eJuhytpRyM5Da4kbLZVpPYGGslpcCXtaJxzGly5uaNxDi+lWxrfoN3yCekRGh2upB2Nc06DKzd3NM7hpXRL4xu0Wz4hPUKjw5W0o3HOaXDl5o7GObyUbml8g3bLJ6RHaHS4knY0zjkNrtzc0TiHl9ItjW/QbvmE9AiNDlfSjsY5p8GVmzsa5/BSuqXxDdotn5AeodHhStrROOc0uHJzR+McXkq3NL5Bu+UT0iM0OlxJOxodrqQdjS3upmWNhE1X/ULad/tz0w/W6HAl7Wh0uJJ2NLa4m5Y1EjZd9Qtp3+3PTT9Yo8OVtKPR4Ura0djiblrWSNh01S+kfbc/N/1gjQ5X0o5GhytpR2OLu2lZI2HTVb+Q9t3+3PSDNTpcSTsaHa6kHY0t7qZljYRNV/1C2nf7c9MP1uhwJe1odLiSdjS2uJuWNRI2XfULad/tz00/WKPDlbSjsXUmNh2upB2NhM222uFuWtZITqT2BhrJaXAl7WhsnYlNhytpRyNhs612uJuWNZITqb2BRnIaXEk7GltnYtPhStrRSNhsqx3upmWN5ERqb6CRnAZX0o7G1pnYdLiSdjQSNttqh7tpWSM5kdobaCSnwZW0o7F1JjYdrqQdjYTNttrhblrWSE6k9gYayWlwJe1obJ2JTYcraUcjYbOtdribljWSE6m9gcY5vHTulrsJm1RpJGzO4aUOV7odm676ej+siU2qNBI25/BShyvdjk1Xfb0f1sQmVRoJm3N4qcOVbsemq77eD2tikyqNhM05vNThSrdj01Vf74c1sUmVRsLmHF7qcKXbsemqr/fDmtikSiNhcw4vdbjS7dh01dd3PqyfxNek92h0uJJ2NJLT4Era0UjYdNUpvP1A7X0UX5Peo9HhStrRSE6DK2lHI2HTVafw9gO191F8TXqPRocraUcjOQ2upB2NhE1XncLbD9TeR/E16T0aHa6kHY3kNLiSdjQSNl11Cm8/UHsfxdek92h0uJJ2NJLT4Era0UjYdNUpvP1A7X0UX5Peo9HhStrRSE6DK2lHI2HTVafw9gOt9/Lyf/F+WC9XeD+slyu8H9bLFd4P6+UK74f1coX3w3q5wvthvVzh/bBervB+WC9XeD+slyu8H9bLFd4P6+UK/wOCyto8mCaaOQAAAABJRU5ErkJggg==","payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款，超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695228}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.230 DEBUG [P2VP9H3y] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/OP2072580595095048192/pay | IP: 127.0.0.1
15:18:15.233 DEBUG [P2VP9H3y] [1] [        main] c.x.p.m.P.selectByOrderNo      : ==>  Preparing: SELECT * FROM t_payment_order WHERE order_no = ? LIMIT 1
15:18:15.233 DEBUG [P2VP9H3y] [1] [        main] c.x.p.m.P.selectByOrderNo      : ==> Parameters: OP2072580595095048192(String)
15:18:15.235 DEBUG [P2VP9H3y] [1] [        main] c.x.p.m.P.selectByOrderNo      : <==      Total: 1
15:18:15.240 DEBUG [P2VP9H3y] [1] [        main] c.x.p.m.P.selectById           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
15:18:15.241 DEBUG [P2VP9H3y] [1] [        main] c.x.p.m.P.selectById           : ==> Parameters: 1(Long)
15:18:15.242 DEBUG [P2VP9H3y] [1] [        main] c.x.p.m.P.selectById           : <==      Total: 1
15:18:15.247 DEBUG [P2VP9H3y] [1] [        main] c.x.p.m.P.updateById           : ==>  Preparing: UPDATE t_payment_order SET order_no=?, user_id=?, plan_id=?, amount=?, channel=?, status=?, qr_code_url=?, order_type=?, paid_channel=?, trade_no=?, paid_time=?, expire_time=?, create_time=?, update_time=? WHERE id=?
15:18:15.247 DEBUG [P2VP9H3y] [1] [        main] c.x.p.m.P.updateById           : ==> Parameters: OP2072580595095048192(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PAID(String), MOCK_PAY:OP2072580595095048192(String), NORMAL(String), WECHAT(String), MOCK_E8A327CE02CA485F(String), 2026-07-02T15:18:15.242857500(LocalDateTime), 2026-07-02T15:33:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2072580595118972929(Long)
15:18:15.251 DEBUG [P2VP9H3y] [1] [        main] c.x.p.m.P.updateById           : <==    Updates: 1
15:18:15.251 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:15.251 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:15.253 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:15.253 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:15.254 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:15.256 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:15.256 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
15:18:15.257 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.U.selectList           : ==> Parameters: 1(Long), 1(Integer)
15:18:15.258 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.U.selectList           : <==      Total: 0
15:18:15.261 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.U.insert               : ==>  Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, effective_to, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:15.261 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.U.insert               : ==> Parameters: 2072580595244802050(Long), 1(Long), PRO(String), RECHARGE(String), 2026-07-02T15:18:15.258573500(LocalDateTime), 2026-08-01T15:18:15.258573500(LocalDateTime), 1(Integer), 支付购买: OP2072580595095048192(String), 2026-07-02T15:18:15.261241300(LocalDateTime), 2026-07-02T15:18:15.261241300(LocalDateTime)
15:18:15.265 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.U.insert               : <==    Updates: 1
15:18:15.266 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, token_version=?, create_time=?, update_time=? WHERE id=?
15:18:15.266 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:18:15.258573500(LocalDateTime), 0(Long), 2026-07-02T15:18:14(LocalDateTime), 2026-07-02T15:18:14(LocalDateTime), 1(Long)
15:18:15.269 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:15.270 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:15.270 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580595307716610(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:15.270168800(LocalDateTime), USER(String), UPDATE(String), 修改用户信息(String), USER(String), 1(Long), PAY:OP2072580595095048192->PRO(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:15.270702300(LocalDateTime)
15:18:15.275 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:15.275 DEBUG [P2VP9H3y] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 修改用户信息
15:18:15.275  INFO [P2VP9H3y] [1] [        main] c.x.u.s.MembershipService      : 用户1通过支付OP2072580595095048192激活会员等级PRO, 有效期30天
15:18:15.275 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:15.276 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:15.278 DEBUG [P2VP9H3y] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 1
15:18:15.279 DEBUG [P2VP9H3y] [1] [        main] c.x.p.m.P.updateById           : ==>  Preparing: UPDATE t_payment_order SET order_no=?, user_id=?, plan_id=?, amount=?, channel=?, status=?, qr_code_url=?, order_type=?, paid_channel=?, trade_no=?, paid_time=?, expire_time=?, membership_record_id=?, create_time=?, update_time=? WHERE id=?
15:18:15.281 DEBUG [P2VP9H3y] [1] [        main] c.x.p.m.P.updateById           : ==> Parameters: OP2072580595095048192(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PAID(String), MOCK_PAY:OP2072580595095048192(String), NORMAL(String), WECHAT(String), MOCK_E8A327CE02CA485F(String), 2026-07-02T15:18:15.242857500(LocalDateTime), 2026-07-02T15:33:15(LocalDateTime), 2072580595244802050(Long), 2026-07-02T15:18:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2072580595118972929(Long)
15:18:15.284 DEBUG [P2VP9H3y] [1] [        main] c.x.p.m.P.updateById           : <==    Updates: 1
15:18:15.285  INFO [P2VP9H3y] [1] [        main] c.x.p.s.PaymentOrderService    : 支付成功: OP2072580595095048192 用户=1 方案=高级会员·月卡 金额=29.90元 会员=PRO 交易号=MOCK_E8A327CE02CA485F 类型=NORMAL
15:18:15.294 DEBUG [P2VP9H3y] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/OP2072580595095048192/pay 200 64ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/payment/order/OP2072580595095048192/pay
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.PaymentController
           Method = com.xuekairui.payment.controller.PaymentController#confirmPay(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"P2VP9H3y", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580595095048192","status":"PAID","amount":29.90,"planName":"高级会员·月卡","membershipLevel":"PRO","paidTime":"2026-07-02 15:18:15","membershipStartDate":null,"membershipEndDate":null},"timestamp":1782976695293}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.302 DEBUG [4ZjyY3B8] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/create | IP: 127.0.0.1
15:18:15.303 DEBUG [4ZjyY3B8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:15.303 DEBUG [4ZjyY3B8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:15.304 DEBUG [4ZjyY3B8] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:15.307 DEBUG [4ZjyY3B8] [1] [        main] c.x.p.m.P.selectById           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
15:18:15.308 DEBUG [4ZjyY3B8] [1] [        main] c.x.p.m.P.selectById           : ==> Parameters: 1(Long)
15:18:15.309 DEBUG [4ZjyY3B8] [1] [        main] c.x.p.m.P.selectById           : <==      Total: 1
15:18:15.316 DEBUG [4ZjyY3B8] [1] [        main] c.x.p.m.P.insert               : ==>  Preparing: INSERT INTO t_payment_order ( id, order_no, user_id, plan_id, amount, channel, status, qr_code_url, order_type, expire_time, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:15.316 DEBUG [4ZjyY3B8] [1] [        main] c.x.p.m.P.insert               : ==> Parameters: 2072580595500654594(Long), OP2072580595497701376(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PENDING(String), MOCK_PAY:OP2072580595497701376(String), NORMAL(String), 2026-07-02T15:33:15.309724100(LocalDateTime), 2026-07-02T15:18:15.316785600(LocalDateTime), 2026-07-02T15:18:15.316785600(LocalDateTime)
15:18:15.319 DEBUG [4ZjyY3B8] [1] [        main] c.x.p.m.P.insert               : <==    Updates: 1
15:18:15.320  INFO [4ZjyY3B8] [1] [        main] c.x.p.s.PaymentOrderService    : 创建支付订单: OP2072580595497701376 用户=1 方案=高级会员·月卡 金额=29.90元 渠道=微信支付
15:18:15.325 DEBUG [4ZjyY3B8] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/create 200 23ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/payment/order/create
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"31"]
             Body = {"planId":1,"channel":"WECHAT"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.PaymentController
           Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"4ZjyY3B8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580595497701376","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARfUlEQVR4Xu3SQY7jShIE0X//S2v2L5zTjlBSaqFpy4KZR5bA/14PDzfwn394eDjB82E93MLzYT3cwvNhPdzC82E93MLzYT3cwvNhPdzC82E93MLzYT3cwvNhPdzC82E93MLzYT3cQvth/fdVfM233zPxfVvcTcsan8XXXFB7X8XXfPs9E9+3xd20rPFZfM0FtfdVfM233zPxfVvcTcsan8XXXFB7X8XXfPs9E9+3xd20rPFZfM0FtfdVfM233zPxfVvcTcsan8XXXFB7X8XXfPs9E9+3xd20rPFZfM0FtTfQOIeX0i2Nc87EJmHTVTu89Ffeqr2Bxjm8lG5pnHMmNgmbrtrhpb/yVu0NNM7hpXRL45wzsUnYdNUOL/2Vt2pvoHEOL6VbGueciU3Cpqt2eOmvvFV7A41zeCnd0jjnTGwSNl21w0t/5a3aG2icw0vplsY5Z2KTsOmqHV76K2/V3kAjOQ2upB2NhM2d1cSVtKORnAZX0o5GhytpR+OC2htoJKfBlbSjkbC5s5q4knY0ktPgStrR6HAl7WhcUHsDjeQ0uJJ2NBI2d1YTV9KORnIaXEk7Gh2upB2NC2pvoJGcBlfSjkbC5s5q4kra0UhOgytpR6PDlbSjcUHtDTSS0+BK2tFI2NxZTVxJOxrJaXAl7Wh0uJJ2NC6ovYFGchpcSTsaCZs7q4kraUcjOQ2upB2NDlfSjsYFtTfQSE6DK2lHo3MmNttqYrPF3bSs0TkNrqQdjQtqb6CRnAZX0o5G50xsttXEZou7aVmjcxpcSTsaF9TeQCM5Da6kHY3Omdhsq4nNFnfTskbnNLiSdjQuqL2BRnIaXEk7Gp0zsdlWE5st7qZljc5pcCXtaFxQewON5DS4knY0Omdis60mNlvcTcsandPgStrRuKD2BhrJaXAl7Wh0zsRmW01stribljU6p8GVtKNxQe0NNJLT4Era0UjYJGxSpbF1JjYJm1RpdE6DK2lH44LaG2gkp8GVtKORsEnYpEpj60xsEjap0uicBlfSjsYFtTfQSE6DK2lHI2GTsEmVxtaZ2CRsUqXROQ2upB2NC2pvoJGcBlfSjkbCJmGTKo2tM7FJ2KRKo3MaXEk7GhfU3kAjOQ2upB2NhE3CJlUaW2dik7BJlUbnNLiSdjQuqL2BRnIaXEk7GgmbhE2qNLbOxCZhkyqNzmlwJe1oXFB7A41zeGl7y5Ut7m6XXUnYpEojOafwUn2r9gYa5/DS9pYrW9zdLruSsEmVRnJO4aX6Vu0NNM7hpe0tV7a4u112JWGTKo3knMJL9a3aG2icw0vbW65scXe77ErCJlUayTmFl+pbtTfQOIeXtrdc2eLudtmVhE2qNJJzCi/Vt2pvoHEOL21vubLF3e2yKwmbVGkk5xReqm/V3lfxNek9Gv+S80l8zQW191V8TXqPxr/kfBJfc0HtfRVfk96j8S85n8TXXFB7X8XXpPdo/EvOJ/E1F9TeV/E16T0a/5LzSXzNBbX3VXxNeo/Gv+R8El9zQev9bfjvdv+wTcImYZOw6aqJKz/Cz757oJGwSdgkbBI2XTVx5Uf42XcPNBI2CZuETcKmqyau/Ag/++6BRsImYZOwSdh01cSVH+Fn3z3QSNgkbBI2CZuumrjyI/zsuwcaCZuETcImYdNVE1d+hPbd/rvpH9ZI2HTVxJVux+ZcpdHhSsImVRoJm1RpJGwuqL2BRnImNl01caXbsTlXaXS4krBJlUbCJlUaCZsLam+gkZyJTVdNXOl2bM5VGh2uJGxSpZGwSZVGwuaC2htoJGdi01UTV7odm3OVRocrCZtUaSRsUqWRsLmg9gYayZnYdNXElW7H5lyl0eFKwiZVGgmbVGkkbC6ovYFGciY2XTVxpduxOVdpdLiSsEmVRsImVRoJmwtq7xDupmWNDlfSjkbnNLiyxd2ETcImYZOw6arX82FpJKfBlS3uJmwSNgmbhE1XvZ4PSyM5Da5scTdhk7BJ2CRsuur1fFgayWlwZYu7CZuETcImYdNVr+fD0khOgytb3E3YJGwSNgmbrno9H5ZGchpc2eJuwiZhk7BJ2HTVq/+wJh7sTtqcw0sJmw5XEjZd9V18cYcrF7TexIPdSZtzeClh0+FKwqarvosv7nDlgtabeLA7aXMOLyVsOlxJ2HTVd/HFHa5c0HoTD3Ynbc7hpYRNhysJm676Lr64w5ULWm/iwe6kzTm8lLDpcCVh01XfxRd3uHJB60082J20OYeXEjYdriRsuuq7+OIOVy6ovRWuJGxSpdHhyp14O13XSM7EJlUaW2di01Wv58M6hbfTdY3kTGxSpbF1JjZd9Xo+rFN4O13XSM7EJlUaW2di01Wv58M6hbfTdY3kTGxSpbF1JjZd9Xo+rFN4O13XSM7EJlUaW2di01Wv58M6hbfTdY3kTGxSpbF1JjZd9Xrnw9LYOjvc3eJuWtZI2KRKo8OVtKPRORObN2i3fEJ6hEbn7HB3i7tpWSNhkyqNDlfSjkbnTGzeoN3yCekRGp2zw90t7qZljYRNqjQ6XEk7Gp0zsXmDdssnpEdodM4Od7e4m5Y1Ejap0uhwJe1odM7E5g3aLZ+QHqHROTvc3eJuWtZI2KRKo8OVtKPRORObN2i3fEJ6hEbn7HB3i7tpWSNhkyqNDlfSjkbnTGze4OjWQCNhkyqNzpnYpEpj6zS4knY0ts4Od2v25cRHdc+ySZVG50xsUqWxdRpcSTsaW2eHuzX7cuKjumfZpEqjcyY2qdLYOg2upB2NrbPD3Zp9OfFR3bNsUqXRORObVGlsnQZX0o7G1tnhbs2+nPio7lk2qdLonIlNqjS2ToMraUdj6+xwt2ZfTnxU9yybVGl0zsQmVRpbp8GVtKOxdXa4W/NGWWDT4Ura0UjYdNXElc/u2KRKI2GTKo3klLxRFth0uJJ2NBI2XTVx5bM7NqnSSNikSiM5JW+UBTYdrqQdjYRNV01c+eyOTao0Ejap0khOyRtlgU2HK2lHI2HTVRNXPrtjkyqNhE2qNJJT8kZZYNPhStrRSNh01cSVz+7YpEojYZMqjeSUvFEW2HS4knY0EjZdNXHlszs2qdJI2KRKIzklb5QDjYRNwiZh01U7vJRuaSRnYrOtGlzpdmxq3igHGgmbhE3Cpqt2eCnd0kjOxGZbNbjS7djUvFEONBI2CZuETVft8FK6pZGcic22anCl27GpeaMcaCRsEjYJm67a4aV0SyM5E5tt1eBKt2NT80Y50EjYJGwSNl21w0vplkZyJjbbqsGVbsem5o1yoJGwSdgkbLpqh5fSLY3kTGy2VYMr3Y5NTVt6MJ3U6HBluzNxt1u22VYTm1RpJGdi0+FK2tGoaUsPppMaHa5sdybudss222pikyqN5ExsOlxJOxo1benBdFKjw5XtzsTdbtlmW01sUqWRnIlNhytpR6OmLT2YTmp0uLLdmbjbLdtsq4lNqjSSM7HpcCXtaNS0pQfTSY0OV7Y7E3e7ZZttNbFJlUZyJjYdrqQdjZq29GA6qdHhynZn4m63bLOtJjap0kjOxKbDlbSjUfNGeRte6m7ZdNXElbSjsXUmNgmbVGkk51b293z4ObzU3bLpqokraUdj60xsEjap0kjOrezv+fBzeKm7ZdNVE1fSjsbWmdgkbFKlkZxb2d/z4efwUnfLpqsmrqQdja0zsUnYpEojObeyv+fDz+Gl7pZNV01cSTsaW2dik7BJlUZybmV/z4efw0vdLZuumriSdjS2zsQmYZMqjeTcSnvPZ975UC9tcbfDlQ5XtjsNXkq3NDpnYtNVr+fDmrjS4cp2p8FL6ZZG50xsuur1fFgTVzpc2e40eCnd0uiciU1XvZ4Pa+JKhyvbnQYvpVsanTOx6arX82FNXOlwZbvT4KV0S6NzJjZd9Xo+rIkrHa5sdxq8lG5pdM7Epqte/YfV4BMSNh2unNvZ4W7C5rP4mvQejc4p2ZcTH5Ww6XDl3M4OdxM2n8XXpPdodE7Jvpz4qIRNhyvndna4m7D5LL4mvUejc0r25cRHJWw6XDm3s8PdhM1n8TXpPRqdU7IvJz4qYdPhyrmdHe4mbD6Lr0nv0eickn058VEJmw5Xzu3scDdh81l8TXqPRueUvFEONLa4m7BJlUaHKwmbVGkkbO7E2+m6RudEWm/iwfrkH3E3YZMqjQ5XEjap0kjY3Im303WNzom03sSD9ck/4m7CJlUaHa4kbFKlkbC5E2+n6xqdE2m9iQfrk3/E3YRNqjQ6XEnYpEojYXMn3k7XNTon0noTD9Yn/4i7CZtUaXS4krBJlUbC5k68na5rdE6k9SYerE/+EXcTNqnS6HAlYZMqjYTNnXg7XdfonEjr/W3476Z/WCNhs8XdtKzR4UqHKwmbVGnU7Mvv4g+QfgKNhM0Wd9OyRocrHa4kbFKlUbMvv4s/QPoJNBI2W9xNyxodrnS4krBJlUbNvvwu/gDpJ9BI2GxxNy1rdLjS4UrCJlUaNfvyu/gDpJ9AI2Gzxd20rNHhSocrCZtUadTsy+/iD5B+Ao2EzRZ307JGhysdriRsUqVR05Ye/Cy+Jr1HI2FzrtJIToMraUejc3a4W9OWHvwsvia9RyNhc67SSE6DK2lHo3N2uFvTlh78LL4mvUcjYXOu0khOgytpR6Nzdrhb05Ye/Cy+Jr1HI2FzrtJIToMraUejc3a4W9OWHvwsvia9RyNhc67SSE6DK2lHo3N2uFvTlh78LL4mvUcjYXOu0khOgytpR6Nzdrhb05YefOPkH/FSuqVxzjmFl9Itjc5pcCVhc5R23Ufd+SwvpVsa55xTeCnd0uicBlcSNkdp133Unc/yUrqlcc45hZfSLY3OaXAlYXOUdt1H3fksL6VbGuecU3gp3dLonAZXEjZHadd91J3P8lK6pXHOOYWX0i2NzmlwJWFzlHbdR935LC+lWxrnnFN4Kd3S6JwGVxI2R2nXfVR6lkaHK2lHI2Gzxd2ETcImVRrJOYWXEjYJmwtqb6CRnAZX0o5GwmaLuwmbhE2qNJJzCi8lbBI2F9TeQCM5Da6kHY2EzRZ3EzYJm1RpJOcUXkrYJGwuqL2BRnIaXEk7GgmbLe4mbBI2qdJIzim8lLBJ2FxQewON5DS4knY0EjZb3E3YJGxSpZGcU3gpYZOwuaD2BhrJaXAl7WgkbLa4m7BJ2KRKIzmn8FLCJmFzQe0NNJLT4Era0eicBle6HZtzeCnd0uhwpcOVmrb0YDqp0eFK2tHonAZXuh2bc3gp3dLocKXDlZq29GA6qdHhStrR6JwGV7odm3N4Kd3S6HClw5WatvRgOqnR4Ura0eicBle6HZtzeCnd0uhwpcOVmrb0YDqp0eFK2tHonAZXuh2bc3gp3dLocKXDlZq29GA6qdHhStrR6JwGV7odm3N4Kd3S6HClw5WatvRgOqnR4Ura0eiciU1X7fBSuqWxdSY2CZuETVe9ng9L4xxeSrc0ts7EJmGTsOmq1/NhaZzDS+mWxtaZ2CRsEjZd9Xo+LI1zeCnd0tg6E5uETcKmq17Ph6VxDi+lWxpbZ2KTsEnYdNXr+bA0zuGldEtj60xsEjYJm656nf2wTuGlc7fc3eLuObyUsNlWDa7UO7U30DiHl87dcneLu+fwUsJmWzW4Uu/U3kDjHF46d8vdLe6ew0sJm23V4Eq9U3sDjXN46dwtd7e4ew4vJWy2VYMr9U7tDTTO4aVzt9zd4u45vJSw2VYNrtQ7tTfQOIeXzt1yd4u75/BSwmZbNbhS79TeV/E1v/AejQ5XOlxJ2HS4UtOWHvwsvuYX3qPR4UqHKwmbDldq2tKDn8XX/MJ7NDpc6XAlYdPhSk1bevCz+JpfeI9GhysdriRsOlypaUsPfhZf8wvv0ehwpcOVhE2HKzVt6cHP4mt+4T0aHa50uJKw6XClZl8+PPwfng/r4RaeD+vhFp4P6+EWng/r4RaeD+vhFp4P6+EWng/r4RaeD+vhFp4P6+EWng/r4RaeD+vhFp4P6+EW/gdcjMPGakRCwgAAAABJRU5ErkJggg==","payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款，超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695325}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.326 DEBUG [sWqB8HvJ] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/OP2072580595497701376/pay | IP: 127.0.0.1
15:18:15.330 DEBUG [sWqB8HvJ] [1] [        main] c.x.p.m.P.selectByOrderNo      : ==>  Preparing: SELECT * FROM t_payment_order WHERE order_no = ? LIMIT 1
15:18:15.330 DEBUG [sWqB8HvJ] [1] [        main] c.x.p.m.P.selectByOrderNo      : ==> Parameters: OP2072580595497701376(String)
15:18:15.332 DEBUG [sWqB8HvJ] [1] [        main] c.x.p.m.P.selectByOrderNo      : <==      Total: 1
15:18:15.332 DEBUG [sWqB8HvJ] [1] [        main] c.x.p.m.P.selectById           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
15:18:15.332 DEBUG [sWqB8HvJ] [1] [        main] c.x.p.m.P.selectById           : ==> Parameters: 1(Long)
15:18:15.335 DEBUG [sWqB8HvJ] [1] [        main] c.x.p.m.P.selectById           : <==      Total: 1
15:18:15.335 DEBUG [sWqB8HvJ] [1] [        main] c.x.p.m.P.updateById           : ==>  Preparing: UPDATE t_payment_order SET order_no=?, user_id=?, plan_id=?, amount=?, channel=?, status=?, qr_code_url=?, order_type=?, paid_channel=?, trade_no=?, paid_time=?, expire_time=?, create_time=?, update_time=? WHERE id=?
15:18:15.336 DEBUG [sWqB8HvJ] [1] [        main] c.x.p.m.P.updateById           : ==> Parameters: OP2072580595497701376(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PAID(String), MOCK_PAY:OP2072580595497701376(String), NORMAL(String), WECHAT(String), MOCK_654D6629F4EB48AE(String), 2026-07-02T15:18:15.335093600(LocalDateTime), 2026-07-02T15:33:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2072580595500654594(Long)
15:18:15.339 DEBUG [sWqB8HvJ] [1] [        main] c.x.p.m.P.updateById           : <==    Updates: 1
15:18:15.339 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:15.339 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:15.342 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:15.342 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:15.342 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:15.344 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 1
15:18:15.345 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.U.updateById           : ==>  Preparing: UPDATE t_user_membership SET user_id=?, level=?, source=?, effective_from=?, effective_to=?, status=?, remark=?, create_time=?, update_time=? WHERE id=?
15:18:15.345 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.U.updateById           : ==> Parameters: 1(Long), PRO(String), RECHARGE(String), 2026-07-02T15:18:15(LocalDateTime), 2026-08-31T15:18:15(LocalDateTime), 1(Integer), 支付购买: OP2072580595095048192(String), 2026-07-02T15:18:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2072580595244802050(Long)
15:18:15.348 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.U.updateById           : <==    Updates: 1
15:18:15.349 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, token_version=?, create_time=?, update_time=? WHERE id=?
15:18:15.349 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-31T15:18:15(LocalDateTime), 0(Long), 2026-07-02T15:18:14(LocalDateTime), 2026-07-02T15:18:14(LocalDateTime), 1(Long)
15:18:15.352 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:15.353 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:15.354 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580595630678017(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:15.353500400(LocalDateTime), USER(String), UPDATE(String), 修改用户信息(String), USER(String), 1(Long), PAY:OP2072580595497701376->PRO(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:15.353500400(LocalDateTime)
15:18:15.357 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:15.357 DEBUG [sWqB8HvJ] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 修改用户信息
15:18:15.357  INFO [sWqB8HvJ] [1] [        main] c.x.u.s.MembershipService      : 用户1通过支付OP2072580595497701376激活会员等级PRO, 有效期30天
15:18:15.357 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:15.357 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:15.361 DEBUG [sWqB8HvJ] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 1
15:18:15.361 DEBUG [sWqB8HvJ] [1] [        main] c.x.p.m.P.updateById           : ==>  Preparing: UPDATE t_payment_order SET order_no=?, user_id=?, plan_id=?, amount=?, channel=?, status=?, qr_code_url=?, order_type=?, paid_channel=?, trade_no=?, paid_time=?, expire_time=?, membership_record_id=?, create_time=?, update_time=? WHERE id=?
15:18:15.362 DEBUG [sWqB8HvJ] [1] [        main] c.x.p.m.P.updateById           : ==> Parameters: OP2072580595497701376(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PAID(String), MOCK_PAY:OP2072580595497701376(String), NORMAL(String), WECHAT(String), MOCK_654D6629F4EB48AE(String), 2026-07-02T15:18:15.335093600(LocalDateTime), 2026-07-02T15:33:15(LocalDateTime), 2072580595244802050(Long), 2026-07-02T15:18:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2072580595500654594(Long)
15:18:15.365 DEBUG [sWqB8HvJ] [1] [        main] c.x.p.m.P.updateById           : <==    Updates: 1
15:18:15.365  INFO [sWqB8HvJ] [1] [        main] c.x.p.s.PaymentOrderService    : 支付成功: OP2072580595497701376 用户=1 方案=高级会员·月卡 金额=29.90元 会员=PRO 交易号=MOCK_654D6629F4EB48AE 类型=NORMAL
15:18:15.371 DEBUG [sWqB8HvJ] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/OP2072580595497701376/pay 200 45ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/payment/order/OP2072580595497701376/pay
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.PaymentController
           Method = com.xuekairui.payment.controller.PaymentController#confirmPay(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"sWqB8HvJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580595497701376","status":"PAID","amount":29.90,"planName":"高级会员·月卡","membershipLevel":"PRO","paidTime":"2026-07-02 15:18:15","membershipStartDate":null,"membershipEndDate":null},"timestamp":1782976695370}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.371 DEBUG [7mbqKcG6] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/OP2072580595497701376/pay | IP: 127.0.0.1
15:18:15.374 DEBUG [7mbqKcG6] [1] [        main] c.x.p.m.P.selectByOrderNo      : ==>  Preparing: SELECT * FROM t_payment_order WHERE order_no = ? LIMIT 1
15:18:15.374 DEBUG [7mbqKcG6] [1] [        main] c.x.p.m.P.selectByOrderNo      : ==> Parameters: OP2072580595497701376(String)
15:18:15.376 DEBUG [7mbqKcG6] [1] [        main] c.x.p.m.P.selectByOrderNo      : <==      Total: 1
15:18:15.379  WARN [7mbqKcG6] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=2005, message=该订单已支付
15:18:15.380 DEBUG [7mbqKcG6] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/order/OP2072580595497701376/pay 200 9ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/payment/order/OP2072580595497701376/pay
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.PaymentController
           Method = com.xuekairui.payment.controller.PaymentController#confirmPay(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"7mbqKcG6", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":2005,"message":"该订单已支付","data":null,"timestamp":1782976695379}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.385 DEBUG [CxU6AMZ8] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/payment/orders | IP: 127.0.0.1
15:18:15.386 DEBUG [CxU6AMZ8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:15.386 DEBUG [CxU6AMZ8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:15.389 DEBUG [CxU6AMZ8] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:15.390 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectByUserId       : ==>  Preparing: SELECT * FROM t_payment_order WHERE user_id = ? ORDER BY create_time DESC
15:18:15.390 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectByUserId       : ==> Parameters: 1(Long)
15:18:15.392 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectByUserId       : <==      Total: 5
15:18:15.393 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectById           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
15:18:15.393 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectById           : ==> Parameters: 1(Long)
15:18:15.394 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectById           : <==      Total: 1
15:18:15.402 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectById           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
15:18:15.402 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectById           : ==> Parameters: 1(Long)
15:18:15.404 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectById           : <==      Total: 1
15:18:15.408 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectById           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
15:18:15.408 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectById           : ==> Parameters: 1(Long)
15:18:15.410 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectById           : <==      Total: 1
15:18:15.416 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectById           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
15:18:15.416 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectById           : ==> Parameters: 1(Long)
15:18:15.421 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectById           : <==      Total: 1
15:18:15.421 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectById           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
15:18:15.421 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectById           : ==> Parameters: 1(Long)
15:18:15.423 DEBUG [CxU6AMZ8] [1] [        main] c.x.p.m.P.selectById           : <==      Total: 1
15:18:15.424 DEBUG [CxU6AMZ8] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/payment/orders 200 39ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/payment/orders
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.PaymentController
           Method = com.xuekairui.payment.controller.PaymentController#listMyOrders(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"CxU6AMZ8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"orderNo":"OP2072580594017112064","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARrklEQVR4Xu3SQW7kShIE0X//S2v2L5wYRzBZJaFpy4aZR5aa//28vDzAf/7Dy8sJ3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEdoP67+v4msSNl01caXDlYRNqjQ655P4mgtq76v4moRNV01c6XAlYZMqjc75JL7mgtr7Kr4mYdNVE1c6XEnYpEqjcz6Jr7mg9r6Kr0nYdNXElQ5XEjap0uicT+JrLqi9r+JrEjZdNXGlw5WETao0OueT+JoLau+r+JqETVdNXOlwJWGTKo3O+SS+5oLaG2icw0vbW650OzZP4u10XaNzTuGl+lbtDTTO4aXtLVe6HZsn8Xa6rtE5p/BSfav2Bhrn8NL2livdjs2TeDtd1+icU3ipvlV7A41zeGl7y5Vux+ZJvJ2ua3TOKbxU36q9gcY5vLS95Uq3Y/Mk3k7XNTrnFF6qb9XeQOMcXtrecqXbsXkSb6frGp1zCi/Vt2pvoJGcBlfSjkZyJjap0jjnNLjS7dikSqPDlbSjcUHtDTSS0+BK2tFIzsQmVRrnnAZXuh2bVGl0uJJ2NC6ovYFGchpcSTsayZnYpErjnNPgSrdjkyqNDlfSjsYFtTfQSE6DK2lHIzkTm1RpnHMaXOl2bFKl0eFK2tG4oPYGGslpcCXtaCRnYpMqjXNOgyvdjk2qNDpcSTsaF9TeQCM5Da6kHY3kTGxSpXHOaXCl27FJlUaHK2lH44LaG2gkp8GVtKORnAZX0o5GciY2CZtUaZxzGlxJOxoX1N5AIzkNrqQdjeQ0uJJ2NJIzsUnYpErjnNPgStrRuKD2BhrJaXAl7Wgkp8GVtKORnIlNwiZVGuecBlfSjsYFtTfQSE6DK2lHIzkNrqQdjeRMbBI2qdI45zS4knY0Lqi9gUZyGlxJOxrJaXAl7WgkZ2KTsEmVxjmnwZW0o3FB7Q00ktPgStrRSE6DK2lHIzkTm4RNqjTOOQ2upB2NC2pvoJGcBlfSjkbnTGwSNgmbhE2qNDpcSTsaHa6kHY0Lam+gkZwGV9KORudMbBI2CZuETao0OlxJOxodrqQdjQtqb6CRnAZX0o5G50xsEjYJm4RNqjQ6XEk7Gh2upB2NC2pvoJGcBlfSjkbnTGwSNgmbhE2qNDpcSTsaHa6kHY0Lam+gkZwGV9KORudMbBI2CZuETao0OlxJOxodrqQdjQtqb6CRnAZX0o5G50xsEjYJm4RNqjQ6XEk7Gh2upB2NC2pvoHEOL6VbGk86O9zd4m5a1jiHl+pbtTfQOIeX0i2NJ50d7m5xNy1rnMNL9a3aG2icw0vplsaTzg53t7ibljXO4aX6Vu0NNM7hpXRL40lnh7tb3E3LGufwUn2r9gYa5/BSuqXxpLPD3S3upmWNc3ipvlV7A41zeCnd0njS2eHuFnfTssY5vFTfqr2v4mvSezT+JeeT+JoLau+r+Jr0Ho1/yfkkvuaC2vsqvia9R+Nfcj6Jr7mg9r6Kr0nv0fiXnE/iay6ova/ia9J7NP4l55P4mgtq76v4mvQejX/J+SS+5oLW+234c7sfbHOu0kjOxKar/gR/9Zf4H9L9l9icqzSSM7Hpqj/BX/0l/od0/yU25yqN5ExsuupP8Fd/if8h3X+JzblKIzkTm676E/zVX+J/SPdfYnOu0kjOxKar/gR/9Zf4H9L9l9icqzSSM7Hpqj9B+0v8A6Q/gcY5vJSwSZVGcna4m5Y1zjmn8NIN2i2fkB6hcQ4vJWxSpZGcHe6mZY1zzim8dIN2yyekR2icw0sJm1RpJGeHu2lZ45xzCi/doN3yCekRGufwUsImVRrJ2eFuWtY455zCSzdot3xCeoTGObyUsEmVRnJ2uJuWNc45p/DSDdotn5AeoXEOLyVsUqWRnB3upmWNc84pvHSDo1sDjS3upmWNc06DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf98PSSE6DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf98PSSE6DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf/sNyPh3QSE6DKwmbhM22eg5vd9dttlWDK/VO7Q00OqfBlYRNwmZbPYe3u+s226rBlXqn9gYandPgSsImYbOtnsPb3XWbbdXgSr1TewONzmlwJWGTsNlWz+Ht7rrNtmpwpd6pvYFG5zS4krBJ2Gyr5/B2d91mWzW4Uu/U3kCjcxpcSdgkbLbVc3i7u26zrRpcqXdab+LBhM22anAl7Wh0uJJ2NDpc6XZsOlxJ2HRV5EZZYLOtGlxJOxodrqQdjQ5Xuh2bDlcSNl0VuVEW2GyrBlfSjkaHK2lHo8OVbsemw5WETVdFbpQFNtuqwZW0o9HhStrR6HCl27HpcCVh01WRG2WBzbZqcCXtaHS4knY0Olzpdmw6XEnYdFXkRllgs60aXEk7Gh2upB2NDle6HZsOVxI2XRW5URbYpEojOQ2upB2NrTOxSZVGhytpR6NzJjY32G/5qIRNqjSS0+BK2tHYOhObVGl0uJJ2NDpnYnOD/ZaPStikSiM5Da6kHY2tM7FJlUaHK2lHo3MmNjfYb/mohE2qNJLT4Era0dg6E5tUaXS4knY0Omdic4P9lo9K2KRKIzkNrqQdja0zsUmVRocraUejcyY2N9hv+aiETao0ktPgStrR2DoTm1RpdLiSdjQ6Z2Jzg5NbEx+esHkSbydsEjYJmy3udriSdjSO8vB6gc2TeDthk7BJ2Gxxt8OVtKNxlIfXC2yexNsJm4RNwmaLux2upB2Nozy8XmDzJN5O2CRsEjZb3O1wJe1oHOXh9QKbJ/F2wiZhk7DZ4m6HK2lH4ygPrxfYPIm3EzYJm4TNFnc7XEk7Gkdp133UFncTNqnSSNh8Fl+TsNlWE5uumrhS79TeIdxN2KRKI2HzWXxNwmZbTWy6auJKvVN7h3A3YZMqjYTNZ/E1CZttNbHpqokr9U7tHcLdhE2qNBI2n8XXJGy21cSmqyau1Du1dwh3Ezap0kjYfBZfk7DZVhObrpq4Uu/U3iHcTdikSiNh81l8TcJmW01sumriSr3Teg0+oX7E/8XdtKzRORObVGl0zsRmWzW40u3Y1OzLiY+68SxwNy1rdM7EJlUanTOx2VYNrnQ7NjX7cuKjbjwL3E3LGp0zsUmVRudMbLZVgyvdjk3Nvpz4qBvPAnfTskbnTGxSpdE5E5tt1eBKt2NTsy8nPurGs8DdtKzRORObVGl0zsRmWzW40u3Y1OzLiY+68SxwNy1rdM7EJlUanTOx2VYNrnQ7NjVt6cGETao0kjOx+Zv4q7rfZdNVE1cSNjdot3xCwiZVGsmZ2PxN/FXd77LpqokrCZsbtFs+IWGTKo3kTGz+Jv6q7nfZdNXElYTNDdotn5CwSZVGciY2fxN/Vfe7bLpq4krC5gbtlk9I2KRKIzkTm7+Jv6r7XTZdNXElYXODdssnJGxSpZGcic3fxF/V/S6brpq4krC5QbvlE7pH2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BIzsQmYZOwSdgkbLpq4sp2p8FL6ZZG50xsuurn/bBsumriynanwUvplkbnTGy66uf9sGy6auLKdqfBS+mWRudMbLrq5/2wbLpq4sp2p8FL6ZZG50xsuurn/bBsumriynanwUvplkbnTGy66uf9sGy6auLKdqfBS+mWRudMbLrq5+yHNbHpqh1e6m7ZJGxSpdHhSrdjkyqNDldu0G75hO4RNl21w0vdLZuETao0OlzpdmxSpdHhyg3aLZ/QPcKmq3Z4qbtlk7BJlUaHK92OTao0Oly5QbvlE7pH2HTVDi91t2wSNqnS6HCl27FJlUaHKzdot3xC9wibrtrhpe6WTcImVRodrnQ7NqnS6HDlBu2WT+geYdNVO7zU3bJJ2KRKo8OVbscmVRodrtyg3fIJ6REaCZuETao0zuGl7pZNwiZVGt/G99W0pQfTSY2ETcImVRrn8FJ3yyZhkyqNb+P7atrSg+mkRsImYZMqjXN4qbtlk7BJlca38X01benBdFIjYZOwSZXGObzU3bJJ2KRK49v4vpq29GA6qZGwSdikSuMcXupu2SRsUqXxbXxfTVt6MJ3USNgkbFKlcQ4vdbdsEjap0vg2vq9mX34X/wDdn8CmqyauJGwSNgmbDlcSNqnSqNmX38U/QPcnsOmqiSsJm4RNwqbDlYRNqjRq9uV38Q/Q/QlsumriSsImYZOw6XAlYZMqjZp9+V38A3R/ApuumriSsEnYJGw6XEnYpEqjZl9+F/8A3Z/ApqsmriRsEjYJmw5XEjap0qjZl9/FP0D3J7DpqokrCZuETcKmw5WETao0atrSg5/F13wb37fF3bSssXUmNkdp133UZ/E138b3bXE3LWtsnYnNUdp1H/VZfM238X1b3E3LGltnYnOUdt1HfRZf82183xZ307LG1pnYHKVd91Gfxdd8G9+3xd20rLF1JjZHadd91GfxNd/G921xNy1rbJ2JzVHadR/15LO8lG5pJGdi82TV4G7CpsOVbscmYXNB7Q00zuGldEsjORObJ6sGdxM2Ha50OzYJmwtqb6BxDi+lWxrJmdg8WTW4m7DpcKXbsUnYXFB7A41zeCnd0kjOxObJqsHdhE2HK92OTcLmgtobaJzDS+mWRnImNk9WDe4mbDpc6XZsEjYX1N5A4xxeSrc0kjOxebJqcDdh0+FKt2OTsLmg9gYayWlwJe1obJ0GVxI2qdJI2HTVDi8lbBI2F9TeQCM5Da6kHY2t0+BKwiZVGgmbrtrhpYRNwuaC2htoJKfBlbSjsXUaXEnYpEojYdNVO7yUsEnYXFB7A43kNLiSdjS2ToMrCZtUaSRsumqHlxI2CZsLam+gkZwGV9KOxtZpcCVhkyqNhE1X7fBSwiZhc0HtDTSS0+BK2tHYOg2uJGxSpZGw6aodXkrYJGwuqL2BRnIaXEk7GslpcCVhk7BJlUZyGlxJ2HS4cpR23UelZ2l0uJJ2NJLT4ErCJmGTKo3kNLiSsOlw5Sjtuo9Kz9LocCXtaCSnwZWETcImVRrJaXAlYdPhylHadR+VnqXR4Ura0UhOgysJm4RNqjSS0+BKwqbDlaO06z4qPUujw5W0o5GcBlcSNgmbVGkkp8GVhE2HK0dp131UepZGhytpRyM5Da4kbBI2qdJIToMrCZsOV47Srvuo9CyNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UH00mNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UH00mNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UHb5z8v3jps7caXDmHlxI226rBlXqn9gYa5/DSZ281uHIOLyVstlWDK/VO7Q00zuGlz95qcOUcXkrYbKsGV+qd2htonMNLn73V4Mo5vJSw2VYNrtQ7tTfQOIeXPnurwZVzeClhs60aXKl3am+gcQ4vffZWgyvn8FLCZls1uFLv1N5X8TXde2xSpZGwSdgkbLpq4soWd4/Srvuoz+JruvfYpEojYZOwSdh01cSVLe4epV33UZ/F13TvsUmVRsImYZOw6aqJK1vcPUq77qM+i6/p3mOTKo2ETcImYdNVE1e2uHuUdt1HfRZf073HJlUaCZuETcKmqyaubHH3KO26j/osvqZ7j02qNBI2CZuETVdNXNni7lGeXX/5Z3k/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR/gfYWtF3xw1oioAAAAASUVORK5CYII=","payUrl":"MOCK_PAY:OP2072580594017112064","expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款，超时订单将自动过期","createTime":"2026-07-02 15:18:15"},{"orderNo":"OP2072580594507845632","planName":"高级会员·月卡","amount":29.90,"channel":"ALIPAY","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAR1klEQVR4Xu3SwY7jypIE0fv/P63Zn3C+cYSSVDeatiyYeWQJ/O/z8nID//mHl5cTvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbQf1n8/xdek92gk5z68nbBJlUbnPImvuaD2foqvSe/RSM59eDthkyqNznkSX3NB7f0UX5Peo5Gc+/B2wiZVGp3zJL7mgtr7Kb4mvUcjOffh7YRNqjQ650l8zQW191N8TXqPRnLuw9sJm1RpdM6T+JoLau+n+Jr0Ho3k3Ie3Ezap0uicJ/E1F9TeQOMcXkq3NBI2XTVxJWHTVTu89Efeqr2Bxjm8lG5pJGy6auJKwqardnjpj7xVewONc3gp3dJI2HTVxJWETVft8NIfeav2Bhrn8FK6pZGw6aqJKwmbrtrhpT/yVu0NNM7hpXRLI2HTVRNXEjZdtcNLf+St2htonMNL6ZZGwqarJq4kbLpqh5f+yFu1N9BIToMraUcjYdPhyhZ307JGchpcSTsaHa6kHY0Lam+gkZwGV9KORsKmw5Ut7qZljeQ0uJJ2NDpcSTsaF9TeQCM5Da6kHY2ETYcrW9xNyxrJaXAl7Wh0uJJ2NC6ovYFGchpcSTsaCZsOV7a4m5Y1ktPgStrR6HAl7WhcUHsDjeQ0uJJ2NBI2Ha5scTctaySnwZW0o9HhStrRuKD2BhrJaXAl7WgkbDpc2eJuWtZIToMraUejw5W0o3FB7Q00ktPgStrR6JyJzbaa2GxxNy1rdE6DK2lH44LaG2gkp8GVtKPRORObbTWx2eJuWtbonAZX0o7GBbU30EhOgytpR6NzJjbbamKzxd20rNE5Da6kHY0Lam+gkZwGV9KORudMbLbVxGaLu2lZo3MaXEk7GhfU3kAjOQ2upB2NzpnYbKuJzRZ307JG5zS4knY0Lqi9gUZyGlxJOxqdM7HZVhObLe6mZY3OaXAl7WhcUHsDjeQ0uJJ2NDpcSTsa55wGV9KOxtZpcCXtaFxQewON5DS4knY0OlxJOxrnnAZX0o7G1mlwJe1oXFB7A43kNLiSdjQ6XEk7GuecBlfSjsbWaXAl7WhcUHsDjeQ0uJJ2NDpcSTsa55wGV9KOxtZpcCXtaFxQewON5DS4knY0OlxJOxrnnAZX0o7G1mlwJe1oXFB7A43kNLiSdjQ6XEk7GuecBlfSjsbWaXAl7WhcUHsDjXN4qbtlkyqNDlfO7UxsUqWRnFN4qb5VewONc3ipu2WTKo0OV87tTGxSpZGcU3ipvlV7A41zeKm7ZZMqjQ5Xzu1MbFKlkZxTeKm+VXsDjXN4qbtlkyqNDlfO7UxsUqWRnFN4qb5VewONc3ipu2WTKo0OV87tTGxSpZGcU3ipvlV7A41zeKm7ZZMqjQ5Xzu1MbFKlkZxTeKm+VXs/xdek92j8S86T+JoLau+n+Jr0Ho1/yXkSX3NB7f0UX5Peo/EvOU/iay6ovZ/ia9J7NP4l50l8zQW191N8TXqPxr/kPImvuaD2foqvSe/R+JecJ/E1F7Ten4b/bvqHNRI2Ha7cibf/Ev7adw80kjOx6XDlTrz9l/DXvnugkZyJTYcrd+Ltv4S/9t0DjeRMbDpcuRNv/yX8te8eaCRnYtPhyp14+y/hr333QCM5E5sOV+7E238J7bv9d9M/rJGw6aqJKwmbVGkkbFKl0eFKwiZVGgmbVGkkbC6ovYFGciY2XTVxJWGTKo2ETao0OlxJ2KRKI2GTKo2EzQW1N9BIzsSmqyauJGxSpZGwSZVGhysJm1RpJGxSpZGwuaD2BhrJmdh01cSVhE2qNBI2qdLocCVhkyqNhE2qNBI2F9TeQCM5E5uumriSsEmVRsImVRodriRsUqWRsEmVRsLmgtobaCRnYtNVE1cSNqnSSNikSqPDlYRNqjQSNqnSSNhc0HoTD25xN2HT4Ura0UhOgysJm1RpJGwSNgmbhE1Xfd4PSyM5Da4kbFKlkbBJ2CRsEjZd9Xk/LI3kNLiSsEmVRsImYZOwSdh01ef9sDSS0+BKwiZVGgmbhE3CJmHTVZ/3w9JIToMrCZtUaSRsEjYJm4RNV33eD0sjOQ2uJGxSpZGwSdgkbBI2XfX55sNq8FHds2wSNufwUnfLpqt+iy/ucOWC1tvho7pn2SRszuGl7pZNV/0WX9zhygWtt8NHdc+ySdicw0vdLZuu+i2+uMOVC1pvh4/qnmWTsDmHl7pbNl31W3xxhysXtN4OH9U9yyZhcw4vdbdsuuq3+OIOVy5ovR0+qnuWTcLmHF7qbtl01W/xxR2uXNB6Ew+mkxodrqQdjS3ubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurTf1jOpwMaHa6kHY1zToMrCZtUaXS4knY0Omdi8wXtlk9Ij9DocCXtaJxzGlxJ2KRKo8OVtKPRORObL2i3fEJ6hEaHK2lH45zT4ErCJlUaHa6kHY3Omdh8QbvlE9IjNDpcSTsa55wGVxI2qdLocCXtaHTOxOYL2i2fkB6h0eFK2tE45zS4krBJlUaHK2lHo3MmNl/QbvmE9AiNDlfSjsY5p8GVhE2qNDpcSTsanTOx+YL9lo/qcGWLu2lZI2GTsEmVRocraUdj6+xwt+aLcoUrW9xNyxoJm4RNqjQ6XEk7Gltnh7s1X5QrXNniblrWSNgkbFKl0eFK2tHYOjvcrfmiXOHKFnfTskbCJmGTKo0OV9KOxtbZ4W7NF+UKV7a4m5Y1EjYJm1RpdLiSdjS2zg53a74oV7iyxd20rJGwSdikSqPDlbSjsXV2uFvzRVlg0+FKwiZhk7BJlUZyGlzpdmxSpZGwSZVGckq+KAtsOlxJ2CRsEjap0khOgyvdjk2qNBI2qdJITskXZYFNhysJm4RNwiZVGslpcKXbsUmVRsImVRrJKfmiLLDpcCVhk7BJ2KRKIzkNrnQ7NqnSSNikSiM5JV+UBTYdriRsEjYJm1RpJKfBlW7HJlUaCZtUaSSn5IuywKbDlYRNwiZhkyqN5DS40u3YpEojYZMqjeSUtKUHu5M2Ha5scbfDlbSjkZyJTao0EjYdrnQ7NjVt6cHupE2HK1vc7XAl7WgkZ2KTKo2ETYcr3Y5NTVt6sDtp0+HKFnc7XEk7GsmZ2KRKI2HT4Uq3Y1PTlh7sTtp0uLLF3Q5X0o5GciY2qdJI2HS40u3Y1LSlB7uTNh2ubHG3w5W0o5GciU2qNBI2Ha50OzY1benB7qRNhytb3O1wJe1oJGdikyqNhE2HK92OTc2+nPio7bNcSdgkbFKl0TkTm1RpJGy2VYMraUejZl9OfNT2Wa4kbBI2qdLonIlNqjQSNtuqwZW0o1GzLyc+avssVxI2CZtUaXTOxCZVGgmbbdXgStrRqNmXEx+1fZYrCZuETao0OmdikyqNhM22anAl7WjU7MuJj9o+y5WETcImVRqdM7FJlUbCZls1uJJ2NGr25cRHbZ/lSsImYZMqjc6Z2KRKI2GzrRpcSTsaNV+UBTbnKo0OV7odm1RpJGdic67SSM6t7O/58ITNuUqjw5VuxyZVGsmZ2JyrNJJzK/t7Pjxhc67S6HCl27FJlUZyJjbnKo3k3Mr+ng9P2JyrNDpc6XZsUqWRnInNuUojObeyv+fDEzbnKo0OV7odm1RpJGdic67SSM6t7O/58ITNuUqjw5VuxyZVGsmZ2JyrNJJzK+09n3nuoe5ucTdhcw4v/fqWRudMbLrq835Yp/DSr29pdM7Epqs+74d1Ci/9+pZG50xsuurzflin8NKvb2l0zsSmqz7vh3UKL/36lkbnTGy66vN+WKfw0q9vaXTOxKarPv2H1eATukfYbKsGV87tTGyexdek92h0Tsm+nPio7lk226rBlXM7E5tn8TXpPRqdU7IvJz6qe5bNtmpw5dzOxOZZfE16j0bnlOzLiY/qnmWzrRpcObczsXkWX5Peo9E5Jfty4qO6Z9lsqwZXzu1MbJ7F16T3aHROyb6c+KjuWTbbqsGVczsTm2fxNek9Gp1T8kU50Ng6E5s78XbCJlUayXkSX5Peo9E5kdabeDCd1Oicic2deDthkyqN5DyJr0nv0eicSOtNPJhOanTOxOZOvJ2wSZVGcp7E16T3aHROpPUmHkwnNTpnYnMn3k7YpEojOU/ia9J7NDon0noTD6aTGp0zsbkTbydsUqWRnCfxNek9Gp0Tab2JB9NJjc6Z2NyJtxM2qdJIzpP4mvQejc6JtN6fhv9u9w/bJGzO4aUOVzpcSdikSqNmX/4Wf4DuJ7BJ2JzDSx2udLiSsEmVRs2+/C3+AN1PYJOwOYeXOlzpcCVhkyqNmn35W/wBup/AJmFzDi91uNLhSsImVRo1+/K3+AN0P4FNwuYcXupwpcOVhE2qNGr25W/xB+h+ApuEzTm81OFKhysJm1Rp1LSlB5/F15x7j7sJm1RpJKfBlbSj0Tk73K1pSw8+i6859x53Ezap0khOgytpR6Nzdrhb05YefBZfc+497iZsUqWRnAZX0o5G5+xwt6YtPfgsvubce9xN2KRKIzkNrqQdjc7Z4W5NW3rwWXzNufe4m7BJlUZyGlxJOxqds8Pdmrb04LP4mnPvcTdhkyqN5DS4knY0OmeHuzVt6cEvTv6/eCnd0kjOxCZVGlvcTcsandPgSsLmKO26j7rzWV5KtzSSM7FJlcYWd9OyRuc0uJKwOUq77qPufJaX0i2N5ExsUqWxxd20rNE5Da4kbI7SrvuoO5/lpXRLIzkTm1RpbHE3LWt0ToMrCZujtOs+6s5neSnd0kjOxCZVGlvcTcsandPgSsLmKO26j7rzWV5KtzSSM7FJlcYWd9OyRuc0uJKwOUq77qPSszQ6XEk7Gh2upB2N5ExsEjYdrpzDSwmbhM0FtTfQSE6DK2lHo8OVtKORnIlNwqbDlXN4KWGTsLmg9gYayWlwJe1odLiSdjSSM7FJ2HS4cg4vJWwSNhfU3kAjOQ2upB2NDlfSjkZyJjYJmw5XzuGlhE3C5oLaG2gkp8GVtKPR4Ura0UjOxCZh0+HKObyUsEnYXFB7A43kNLiSdjQ6XEk7GsmZ2CRsOlw5h5cSNgmbC2pvoJGcBlfSjsbWmdh0uJJ2NDpcSTsaHa50uFLTlh5MJzU6XEk7GltnYtPhStrR6HAl7Wh0uNLhSk1bejCd1OhwJe1obJ2JTYcraUejw5W0o9HhSocrNW3pwXRSo8OVtKOxdSY2Ha6kHY0OV9KORocrHa7UtKUH00mNDlfSjsbWmdh0uJJ2NDpcSTsaHa50uFLTlh5MJzU6XEk7GltnYtPhStrR6HAl7Wh0uNLhSk1bejCd1OhwJe1oJOc+vN3hStrR2DoTm4RNwqarPu+H1eDtDlfSjsbWmdgkbBI2XfV5P6wGb3e4knY0ts7EJmGTsOmqz/thNXi7w5W0o7F1JjYJm4RNV33eD6vB2x2upB2NrTOxSdgkbLrq835YDd7ucCXtaGydiU3CJmHTVZ+zH9YpvNTdsulwJe1o3Im3EzbbqsGVeqf2Bhrn8FJ3y6bDlbSjcSfeTthsqwZX6p3aG2icw0vdLZsOV9KOxp14O2GzrRpcqXdqb6BxDi91t2w6XEk7Gnfi7YTNtmpwpd6pvYHGObzU3bLpcCXtaNyJtxM226rBlXqn9gYa5/BSd8umw5W0o3En3k7YbKsGV+qd2vspvia9R6NzJjZd1eBuWtbocCVh0+FKTVt68Fl8TXqPRudMbLqqwd20rNHhSsKmw5WatvTgs/ia9B6NzpnYdFWDu2lZo8OVhE2HKzVt6cFn8TXpPRqdM7HpqgZ307JGhysJmw5XatrSg8/ia9J7NDpnYtNVDe6mZY0OVxI2Ha7UtKUHn8XXpPdodM7Epqsa3E3LGh2uJGw6XKnZly8v/4P3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX/Ay6DIKLn9Mh8AAAAAElFTkSuQmCC","payUrl":"MOCK_PAY:OP2072580594507845632","expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款，超时订单将自动过期","createTime":"2026-07-02 15:18:15"},{"orderNo":"OP2072580594814029824","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARVUlEQVR4Xu3SQZLjSnAE0X//S7f2LwOmsESBFDXw5Zh7ZHEa//29vDzAf/7Dy8sJ3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEdoP67+v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7GltnYpOwSdgkbFKlcc5pcCXtaFxQewON5DS4knY0ts7EJmGTsEnYpErjnNPgStrRuKD2BhrJaXAl7WhsnYlNwiZhk7BJlcY5p8GVtKNxQe0NNJLT4Era0dg6E5uETcImYZMqjXNOgytpR+OC2htoJKfBlbSjsXUmNgmbhE3CJlUa55wGV9KOxgW1N9BIToMraUdj60xsEjYJm4RNqjTOOQ2upB2NC2pvoJGcBlfSjkZyTuGlhE3CJlUaHa6kHY0OV9KOxgW1N9BIToMraUcjOafwUsImYZMqjQ5X0o5GhytpR+OC2htoJKfBlbSjkZxTeClhk7BJlUaHK2lHo8OVtKNxQe0NNJLT4Era0UjOKbyUsEnYpEqjw5W0o9HhStrRuKD2BhrJaXAl7Wgk5xReStgkbFKl0eFK2tHocCXtaFxQewON5DS4knY0knMKLyVsEjap0uhwJe1odLiSdjQuqL2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2v4mvSezT+JeeT+JoLau+r+Jr0Ho1/yfkkvuaC2vsqvia9R+Nfcj6Jr7mg9r6Kr0nv0fiXnE/iay6ova/ia9J7NP4l55P4mgtq76v4mvQejX/J+SS+5oLW+7+GP7f+wQu8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT/Br/4S/yBP/km8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT9B+0v8D0j/BRrn8FLCJmFzDi+lWxrnnFN46Qbtlk9Ij9A4h5cSNgmbc3gp3dI455zCSzdot3xCeoTGObyUsEnYnMNL6ZbGOecUXrpBu+UT0iM0zuGlhE3C5hxeSrc0zjmn8NIN2i2fkB6hcQ4vJWwSNufwUrqlcc45hZdu0G75hPQIjXN4KWGTsDmHl9ItjXPOKbx0g3bLJ6RHaHS4krBJ2CRszuGlLe4mbBI2CZuETVf9vR/WKby0xd2ETcImYZOw6aq/98M6hZe2uJuwSdgkbBI2XfX3flin8NIWdxM2CZuETcKmq/7eD+sUXtribsImYZOwSdh01d/7YZ3CS1vcTdgkbBI2CZuu+rvzYU1sUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLDyZsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLD6aTGk/i7YRNV01cSdicw0vplkbnTGxu0G75hPQIjSfxdsKmqyauJGzO4aV0S6NzJjY3aLd8QnqExpN4O2HTVRNXEjbn8FK6pdE5E5sbtFs+IT1C40m8nbDpqokrCZtzeCnd0uicic0N2i2fkB6h8STeTth01cSVhM05vJRuaXTOxOYG7ZZPSI/QeBJvJ2y6auJKwuYcXkq3NDpnYnODdssnpEdoJGeHuwmbVGlscTdhkyqNhE2HK2lH4yjtuo9Kz9JIzg53Ezap0tjibsImVRoJmw5X0o7GUdp1H5WepZGcHe4mbFKlscXdhE2qNBI2Ha6kHY2jtOs+Kj1LIzk73E3YpEpji7sJm1RpJGw6XEk7Gkdp131UepZGcna4m7BJlcYWdxM2qdJI2HS4knY0jtKu+6j0LI3k7HA3YZMqjS3uJmxSpZGw6XAl7WgcZb/uM9NDNba4m5Y1zjk73E3YbKuJTVdNXKl3Wm/iwXRSY4u7aVnjnLPD3YTNtprYdNXElXqn9SYeTCc1tribljXOOTvcTdhsq4lNV01cqXdab+LBdFJji7tpWeOcs8PdhM22mth01cSVeqf1Jh5MJzW2uJuWNc45O9xN2GyriU1XTVypd1pv4sF0UmOLu2lZ45yzw92Ezbaa2HTVxJV6p/UmHqxPLvBSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKAca5/BSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKP9f4K96Em931226auJKwuYG+y0f9Zv4q57E2911m66auJKwucF+y0f9Jv6qJ/F2d92mqyauJGxusN/yUb+Jv+pJvN1dt+mqiSsJmxvst3zUb+KvehJvd9dtumriSsLmBvstH/Wb+KuexNvddZuumriSsLlBu+UTto9wJWHzJN7e4m7C5slq4kra0UjYXFB7A40OVxI2T+LtLe4mbJ6sJq6kHY2EzQW1N9DocCVh8yTe3uJuwubJauJK2tFI2FxQewONDlcSNk/i7S3uJmyerCaupB2NhM0FtTfQ6HAlYfMk3t7ibsLmyWriStrRSNhcUHsDjQ5XEjZP4u0t7iZsnqwmrqQdjYTNBbU30EhOgyvbnQYvJWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV39kPq8GVbsemqxrcTdikSqPDlW7HJlUaHa7coN3yCdtHuNLt2HRVg7sJm1RpdLjS7dikSqPDlRu0Wz5h+whXuh2brmpwN2GTKo0OV7odm1RpdLhyg3bLJ2wf4Uq3Y9NVDe4mbFKl0eFKt2OTKo0OV27QbvmE7SNc6XZsuqrB3YRNqjQ6XOl2bFKl0eHKDdotn7B9hCvdjk1XNbibsEmVRocr3Y5NqjQ6XLlBu+UT0iM0kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9Xsy+/i/8BCZttNbFJ2HTVxJUOVxI2qdKo2Zffxf+AhM22mtgkbLpq4kqHKwmbVGnU7Mvv4n9AwmZbTWwSNl01caXDlYRNqjRq9uV38T8gYbOtJjYJm66auNLhSsImVRo1+/K7+B+QsNlWE5uETVdNXOlwJWGTKo2affld/A9I2GyriU3CpqsmrnS4krBJlUZNW3rws/iahE3CZou7W9xNyxpbZ2JzlHbdR30WX5OwSdhscXeLu2lZY+tMbI7Srvuoz+JrEjYJmy3ubnE3LWtsnYnNUdp1H/VZfE3CJmGzxd0t7qZlja0zsTlKu+6jPouvSdgkbLa4u8XdtKyxdSY2R2nXfdRn8TUJm4TNFne3uJuWNbbOxOYo7bqPevJZXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00zuGldEsjOQ2upB2N5ExsUqWRsOlwpduxSdhcUHsDjXN4Kd3SSE6DK2lHIzkTm1RpJGw6XOl2bBI2F9TeQOMcXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00ktPgStrR6JyJTcImYXOu0jiHlxI2CZsLam+gkZwGV9KORudMbBI2CZtzlcY5vJSwSdhcUHsDjeQ0uJJ2NDpnYpOwSdicqzTO4aWETcLmgtobaCSnwZW0o9E5E5uETcLmXKVxDi8lbBI2F9TeQCM5Da6kHY3OmdgkbBI25yqNc3gpYZOwuaD2BhrJaXAl7Wh0zsQmYZOwOVdpnMNLCZuEzQW1N9BIToMraUfjSafBlS3uJmwSNh2uHKVd91HpWRodrqQdjSedBle2uJuwSdh0uHKUdt1HpWdpdLiSdjSedBpc2eJuwiZh0+HKUdp1H5WepdHhStrReNJpcGWLuwmbhE2HK0dp131UepZGhytpR+NJp8GVLe4mbBI2Ha4cpV33UelZGh2upB2NJ50GV7a4m7BJ2HS4cpR23UelZ2l0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT144+T/ipeevDXx9va6K92OTcJmWzW4Uu/U3kDjHF568tbE29vrrnQ7NgmbbdXgSr1TewONc3jpyVsTb2+vu9Lt2CRstlWDK/VO7Q00zuGlJ29NvL297kq3Y5Ow2VYNrtQ7tTfQOIeXnrw18fb2uivdjk3CZls1uFLv1N5A4xxeevLWxNvb6650OzYJm23V4Eq9U3tfxdd8+z0T35ew6aqJK1vcPUq77qM+i6/59nsmvi9h01UTV7a4e5R23Ud9Fl/z7fdMfF/Cpqsmrmxx9yjtuo/6LL7m2++Z+L6ETVdNXNni7lHadR/1WXzNt98z8X0Jm66auLLF3aO06z7qs/iab79n4vsSNl01cWWLu0d5dv3ln+X9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuF/ANQkBqB7RoIFAAAAAElFTkSuQmCC","payUrl":"MOCK_PAY:OP2072580594814029824","expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款，超时订单将自动过期","createTime":"2026-07-02 15:18:15"},{"orderNo":"OP2072580595095048192","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PAID","qrCodeBase64":null,"payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":null,"createTime":"2026-07-02 15:18:15"},{"orderNo":"OP2072580595497701376","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PAID","qrCodeBase64":null,"payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":null,"createTime":"2026-07-02 15:18:15"}],"timestamp":1782976695423}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.432 DEBUG [stKnnthP] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/payment/plans | IP: 127.0.0.1
15:18:15.432 DEBUG [stKnnthP] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:15.432 DEBUG [stKnnthP] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:15.435 DEBUG [stKnnthP] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:15.443 DEBUG [stKnnthP] [1] [        main] c.x.p.m.P.selectCount          : ==>  Preparing: SELECT COUNT( * ) AS total FROM t_payment_plan WHERE (plan_code = ?)
15:18:15.443 DEBUG [stKnnthP] [1] [        main] c.x.p.m.P.selectCount          : ==> Parameters: BIENNIAL(String)
15:18:15.444 DEBUG [stKnnthP] [1] [        main] c.x.p.m.P.selectCount          : <==      Total: 1
15:18:15.445 DEBUG [stKnnthP] [1] [        main] c.x.p.m.P.insert               : ==>  Preparing: INSERT INTO t_payment_plan ( id, plan_name, plan_code, membership_level, price, original_price, duration_days, sort_order, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:15.445 DEBUG [stKnnthP] [1] [        main] c.x.p.m.P.insert               : ==> Parameters: 2072580596041719810(Long), 两年卡(String), BIENNIAL(String), PRO(String), 1599(BigDecimal), 1798(BigDecimal), 730(Integer), 0(Integer), 1(Integer), 2026-07-02T15:18:15.445902800(LocalDateTime), 2026-07-02T15:18:15.445902800(LocalDateTime)
15:18:15.449 DEBUG [stKnnthP] [1] [        main] c.x.p.m.P.insert               : <==    Updates: 1
15:18:15.449  INFO [stKnnthP] [1] [        main] c.x.p.s.PaymentPlanService     : 创建支付方案: 两年卡 (BIENNIAL)
15:18:15.454 DEBUG [stKnnthP] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/payment/plans 200 22ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/payment/plans
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"138"]
             Body = {"planCode":"BIENNIAL","planName":"两年卡","price":1599,"originalPrice":1798,"durationDays":730,"membershipLevel":"PRO","tag":"省11%"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.AdminPaymentController
           Method = com.xuekairui.payment.controller.AdminPaymentController#createPlan(AdminPlanUpsertRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"stKnnthP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":2072580596041719810,"planName":"两年卡","planCode":"BIENNIAL","membershipLevel":"PRO","price":1599,"originalPrice":1798,"durationDays":730,"description":null,"tag":"省11%","sortOrder":0},"timestamp":1782976695453}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.459 DEBUG [kR6hYVzh] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/payment/plans/1 | IP: 127.0.0.1
15:18:15.460 DEBUG [kR6hYVzh] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:15.460 DEBUG [kR6hYVzh] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:15.461 DEBUG [kR6hYVzh] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:15.464 DEBUG [kR6hYVzh] [1] [        main] c.x.p.m.P.selectById           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
15:18:15.464 DEBUG [kR6hYVzh] [1] [        main] c.x.p.m.P.selectById           : ==> Parameters: 1(Long)
15:18:15.466 DEBUG [kR6hYVzh] [1] [        main] c.x.p.m.P.selectById           : <==      Total: 1
15:18:15.467 DEBUG [kR6hYVzh] [1] [        main] c.x.p.m.P.selectCount          : ==>  Preparing: SELECT COUNT( * ) AS total FROM t_payment_plan WHERE (plan_code = ?)
15:18:15.467 DEBUG [kR6hYVzh] [1] [        main] c.x.p.m.P.selectCount          : ==> Parameters: MONTHLY(String)
15:18:15.469 DEBUG [kR6hYVzh] [1] [        main] c.x.p.m.P.selectCount          : <==      Total: 1
15:18:15.470 DEBUG [kR6hYVzh] [1] [        main] c.x.p.m.P.updateById           : ==>  Preparing: UPDATE t_payment_plan SET plan_name=?, plan_code=?, membership_level=?, price=?, original_price=?, duration_days=?, sort_order=?, status=?, create_time=?, update_time=? WHERE id=?
15:18:15.470 DEBUG [kR6hYVzh] [1] [        main] c.x.p.m.P.updateById           : ==> Parameters: 月卡(更新)(String), MONTHLY(String), PRO(String), 109(BigDecimal), 109(BigDecimal), 30(Integer), 3(Integer), 1(Integer), 2026-07-02T15:18:14(LocalDateTime), 2026-07-02T15:18:14(LocalDateTime), 1(Long)
15:18:15.473 DEBUG [kR6hYVzh] [1] [        main] c.x.p.m.P.updateById           : <==    Updates: 1
15:18:15.473  INFO [kR6hYVzh] [1] [        main] c.x.p.s.PaymentPlanService     : 更新支付方案: 月卡(更新) (MONTHLY)
15:18:15.478 DEBUG [kR6hYVzh] [1] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/payment/plans/1 200 19ms

MockHttpServletRequest:
      HTTP Method = PUT
      Request URI = /api/admin/payment/plans/1
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"124"]
             Body = {"planCode":"MONTHLY","planName":"月卡(更新)","price":109,"originalPrice":109,"durationDays":30,"membershipLevel":"PRO"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.AdminPaymentController
           Method = com.xuekairui.payment.controller.AdminPaymentController#updatePlan(Long, AdminPlanUpsertRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"kR6hYVzh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"planName":"月卡(更新)","planCode":"MONTHLY","membershipLevel":"PRO","price":109,"originalPrice":109,"durationDays":30,"description":null,"tag":null,"sortOrder":3},"timestamp":1782976695477}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.486 DEBUG [CBzU7AQs] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/payment/plans/1/status | IP: 127.0.0.1
15:18:15.487 DEBUG [CBzU7AQs] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:15.487 DEBUG [CBzU7AQs] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:15.489 DEBUG [CBzU7AQs] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:15.492 DEBUG [CBzU7AQs] [1] [        main] c.x.p.m.P.selectById           : ==>  Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
15:18:15.493 DEBUG [CBzU7AQs] [1] [        main] c.x.p.m.P.selectById           : ==> Parameters: 1(Long)
15:18:15.494 DEBUG [CBzU7AQs] [1] [        main] c.x.p.m.P.selectById           : <==      Total: 1
15:18:15.494 DEBUG [CBzU7AQs] [1] [        main] c.x.p.m.P.updateById           : ==>  Preparing: UPDATE t_payment_plan SET plan_name=?, plan_code=?, membership_level=?, price=?, original_price=?, duration_days=?, sort_order=?, status=?, description=?, create_time=?, update_time=? WHERE id=?
15:18:15.494 DEBUG [CBzU7AQs] [1] [        main] c.x.p.m.P.updateById           : ==> Parameters: 月卡(更新)(String), MONTHLY(String), PRO(String), 109.00(BigDecimal), 109.00(BigDecimal), 30(Integer), 3(Integer), 0(Integer), 每天不限量· 1个月29.9（原价59.9）(String), 2026-07-02T15:18:14(LocalDateTime), 2026-07-02T15:18:14(LocalDateTime), 1(Long)
15:18:15.497 DEBUG [CBzU7AQs] [1] [        main] c.x.p.m.P.updateById           : <==    Updates: 1
15:18:15.497  INFO [CBzU7AQs] [1] [        main] c.x.p.s.PaymentPlanService     : 切换支付方案状态: 月卡(更新) -> status=0
15:18:15.503 DEBUG [CBzU7AQs] [1] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/payment/plans/1/status 200 17ms

MockHttpServletRequest:
      HTTP Method = PUT
      Request URI = /api/admin/payment/plans/1/status
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"12"]
             Body = {"status":0}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.AdminPaymentController
           Method = com.xuekairui.payment.controller.AdminPaymentController#toggleStatus(Long, Map)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"CBzU7AQs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976695502}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.505 DEBUG [3wwVZC9c] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/payment/plans | IP: 127.0.0.1
15:18:15.507  WARN [3wwVZC9c] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/payment/plans 401 2ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/payment/plans
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"90"]
             Body = {"planCode":"TEST","planName":"测试","price":1,"durationDays":1,"membershipLevel":"PRO"}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"3wwVZC9c", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976695506}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.513 DEBUG [44xjfQz2] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/payment/plans/1 | IP: 127.0.0.1
15:18:15.514 DEBUG [44xjfQz2] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:15.514 DEBUG [44xjfQz2] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:15.515 DEBUG [44xjfQz2] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:15.516  WARN [44xjfQz2] [1] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/payment/plans/1 403 3ms

MockHttpServletRequest:
      HTTP Method = PUT
      Request URI = /api/admin/payment/plans/1
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MCwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5NSwiZXhwIjoxNzgzMDYzMDk1fQ.bsBXxeXrKAqT7fbQ4WRdyGzEh4xF7Bb1DuU_S8wy8VR-qiCvIT0REc_hL4CUmDI-PO2lkj2c44gNKjWWi5Rs9A", Content-Length:"95"]
             Body = {"planCode":"MONTHLY","planName":"月卡","price":99,"durationDays":30,"membershipLevel":"PRO"}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 403
    Error message = null
          Headers = [X-Request-Id:"44xjfQz2", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":403,"message":"无权限访问","data":null,"timestamp":1782976695516}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.520 DEBUG [ncVj6cc8] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/callback/wechat | IP: 127.0.0.1
15:18:15.521  INFO [ncVj6cc8] [] [        main] .p.c.PaymentCallbackController : 【模拟】收到微信支付回调: orderNo=null tradeNo=null
15:18:15.521  WARN [ncVj6cc8] [] [        main] .p.c.PaymentCallbackController : 微信回调缺少订单号
15:18:15.522 DEBUG [ncVj6cc8] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/callback/wechat 200 2ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/payment/callback/wechat
       Parameters = {}
          Headers = [Content-Type:"application/x-www-form-urlencoded;charset=UTF-8"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.PaymentCallbackController
           Method = com.xuekairui.payment.controller.PaymentCallbackController#wechatCallback(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ncVj6cc8", Content-Type:"text/plain;charset=UTF-8", Content-Length:"4", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = text/plain;charset=UTF-8
             Body = FAIL
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:15.526 DEBUG [PTf8nGBr] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/callback/alipay | IP: 127.0.0.1
15:18:15.527  INFO [PTf8nGBr] [] [        main] .p.c.PaymentCallbackController : 【模拟】收到支付宝回调: orderNo=null tradeNo=null
15:18:15.527  WARN [PTf8nGBr] [] [        main] .p.c.PaymentCallbackController : 支付宝回调缺少订单号
15:18:15.528 DEBUG [PTf8nGBr] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/payment/callback/alipay 200 2ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/payment/callback/alipay
       Parameters = {}
          Headers = [Content-Type:"application/x-www-form-urlencoded;charset=UTF-8"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.payment.controller.PaymentCallbackController
           Method = com.xuekairui.payment.controller.PaymentCallbackController#alipayCallback(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"PTf8nGBr", Content-Type:"text/plain;charset=UTF-8", Content-Length:"4", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = text/plain;charset=UTF-8
             Body = fail
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 18, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.593 s -- in 支付模块接口测试
[INFO] Running com.xuekairui.gateway.PlatformAccountBindingTest
15:18:15.532  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.PlatformAccountBindingTest]: PlatformAccountBindingTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:15.534  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.PlatformAccountBindingTest
15:18:18.633 DEBUG [CzkhgEqt] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:18:18.635 DEBUG [CzkhgEqt] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:18:18.636 DEBUG [CzkhgEqt] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13800138000(String)
15:18:18.637 DEBUG [CzkhgEqt] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 1
15:18:18.637 DEBUG [CzkhgEqt] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
15:18:18.637 DEBUG [CzkhgEqt] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.637467900(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.641 DEBUG [CzkhgEqt] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.642 DEBUG [CzkhgEqt] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.642 DEBUG [CzkhgEqt] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.637467900(LocalDateTime), 127.0.0.1(String), 1(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.644 DEBUG [CzkhgEqt] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.645 DEBUG [CzkhgEqt] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:18.645 DEBUG [CzkhgEqt] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:18.647 DEBUG [CzkhgEqt] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:18.647 DEBUG [CzkhgEqt] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:18.647 DEBUG [CzkhgEqt] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:18.650 DEBUG [CzkhgEqt] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:18.650 DEBUG [CzkhgEqt] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:18.650 DEBUG [CzkhgEqt] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:18.653 DEBUG [CzkhgEqt] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:18.653 DEBUG [CzkhgEqt] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.653 DEBUG [CzkhgEqt] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580609518018562(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.653023800(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.653550300(LocalDateTime)
15:18:18.657 DEBUG [CzkhgEqt] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:18.657 DEBUG [CzkhgEqt] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:18:18.663 DEBUG [CzkhgEqt] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 30ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","code":"123456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"CzkhgEqt", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.DwLxUCP1WIogZR390EgMTUPXzDT6wQ4GxS04PI4ogkCShZyeG3QIHg4TjSz2Ic6_sWcMz7USNVwKgaI1zIGofw","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976698662}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.663  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
15:18:18.665 DEBUG [wgE6Rqh7] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind | IP: 127.0.0.1
15:18:18.669 DEBUG [wgE6Rqh7] [1] [        main] .u.m.P.selectByUserAndPlatform : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
15:18:18.669 DEBUG [wgE6Rqh7] [1] [        main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
15:18:18.671 DEBUG [wgE6Rqh7] [1] [        main] .u.m.P.selectByUserAndPlatform : <==      Total: 0
15:18:18.673 DEBUG [wgE6Rqh7] [1] [        main] c.x.u.m.P.insert               : ==>  Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.674 DEBUG [wgE6Rqh7] [1] [        main] c.x.u.m.P.insert               : ==> Parameters: 2072580609580933121(Long), 1(Long), yaoshibang(String), 药师帮(String), J2sm/7ZSTEqpVLqnb0gvOFtbl0szwzM7HQcFw5LUobJDO5xznMr1(String), 8OvI7mta/feZVi3l9erAmiyoGmhnhKliclHj5m4lXHhKKwRWC8KBbVCN3GuA(String), true(Boolean), PENDING(String), 2026-07-02T15:18:18.673502100(LocalDateTime), 2026-07-02T15:18:18.673502100(LocalDateTime)
15:18:18.677 DEBUG [wgE6Rqh7] [1] [        main] c.x.u.m.P.insert               : <==    Updates: 1
15:18:18.677  INFO [wgE6Rqh7] [1] [        main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaoshibang
15:18:18.683 DEBUG [wgE6Rqh7] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.683 DEBUG [wgE6Rqh7] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580609648041985(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.683314500(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.683853400(LocalDateTime)
15:18:18.689 DEBUG [wgE6Rqh7] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:18.689 DEBUG [wgE6Rqh7] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
15:18:18.690 DEBUG [wgE6Rqh7] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind 200 25ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/platform-account/bind
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.DwLxUCP1WIogZR390EgMTUPXzDT6wQ4GxS04PI4ogkCShZyeG3QIHg4TjSz2Ic6_sWcMz7USNVwKgaI1zIGofw", Content-Length:"111"]
             Body = {"platformCode":"yaoshibang","platformName":"药师帮","account":"13800138000","password":"test_password_123"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"wgE6Rqh7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698689}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.690  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 绑定药师帮账号成功
15:18:18.693 DEBUG [dZ7XuQBs] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:18:18.696 DEBUG [dZ7XuQBs] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:18:18.697 DEBUG [dZ7XuQBs] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13800138000(String)
15:18:18.698 DEBUG [dZ7XuQBs] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 1
15:18:18.699 DEBUG [dZ7XuQBs] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.699 DEBUG [dZ7XuQBs] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.699420400(LocalDateTime), 127.0.0.1(String), 1(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.702 DEBUG [dZ7XuQBs] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.703 DEBUG [dZ7XuQBs] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.703 DEBUG [dZ7XuQBs] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.699420400(LocalDateTime), 127.0.0.1(String), 2(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.705 DEBUG [dZ7XuQBs] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.705 DEBUG [dZ7XuQBs] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:18.706 DEBUG [dZ7XuQBs] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:18.707 DEBUG [dZ7XuQBs] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:18.707 DEBUG [dZ7XuQBs] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:18.707 DEBUG [dZ7XuQBs] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:18.708 DEBUG [dZ7XuQBs] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:18.709 DEBUG [dZ7XuQBs] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:18.709 DEBUG [dZ7XuQBs] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:18.711 DEBUG [dZ7XuQBs] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:18.711 DEBUG [dZ7XuQBs] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.712 DEBUG [dZ7XuQBs] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580609710956546(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.711581200(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.711581200(LocalDateTime)
15:18:18.714 DEBUG [dZ7XuQBs] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:18.714 DEBUG [dZ7XuQBs] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:18:18.719 DEBUG [dZ7XuQBs] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 26ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","code":"123456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"dZ7XuQBs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.bNN1LMyocxH1F2r3e0hEq-8lkXhPTNRnNk7HGKZZUZBO1x1FWZlOn4kFi4HomYvuv6mBmG0yXxX7G4gHM-CPeg","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698718}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.719  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
15:18:18.720 DEBUG [eKKTWZtb] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind | IP: 127.0.0.1
15:18:18.723 DEBUG [eKKTWZtb] [1] [        main] .u.m.P.selectByUserAndPlatform : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
15:18:18.723 DEBUG [eKKTWZtb] [1] [        main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaobangmang(String)
15:18:18.724 DEBUG [eKKTWZtb] [1] [        main] .u.m.P.selectByUserAndPlatform : <==      Total: 0
15:18:18.725 DEBUG [eKKTWZtb] [1] [        main] c.x.u.m.P.insert               : ==>  Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.726 DEBUG [eKKTWZtb] [1] [        main] c.x.u.m.P.insert               : ==> Parameters: 2072580609778065409(Long), 1(Long), yaobangmang(String), 药帮忙(String), W5i1KGnIoNTqUu/icmspS7Xo45EnvfLSUzIDw/LlTYpOKLQ5HN/G(String), qfShZ0DvC/AhrMANC03BDbOqZ32FbTCRVQTBjX7ajT85NU+Ef98yhkf0QsUv(String), true(Boolean), PENDING(String), 2026-07-02T15:18:18.725526900(LocalDateTime), 2026-07-02T15:18:18.725526900(LocalDateTime)
15:18:18.728 DEBUG [eKKTWZtb] [1] [        main] c.x.u.m.P.insert               : <==    Updates: 1
15:18:18.728  INFO [eKKTWZtb] [1] [        main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaobangmang
15:18:18.733 DEBUG [eKKTWZtb] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.733 DEBUG [eKKTWZtb] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580609840979970(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.732543100(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaobangmang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.733067200(LocalDateTime)
15:18:18.737 DEBUG [eKKTWZtb] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:18.737 DEBUG [eKKTWZtb] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
15:18:18.737 DEBUG [eKKTWZtb] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind 200 17ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/platform-account/bind
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.bNN1LMyocxH1F2r3e0hEq-8lkXhPTNRnNk7HGKZZUZBO1x1FWZlOn4kFi4HomYvuv6mBmG0yXxX7G4gHM-CPeg", Content-Length:"112"]
             Body = {"platformCode":"yaobangmang","platformName":"药帮忙","account":"13900139000","password":"test_password_456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"eKKTWZtb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698737}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.738  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 绑定药帮忙账号成功
15:18:18.741 DEBUG [UJrtVWxg] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:18:18.743 DEBUG [UJrtVWxg] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:18:18.743 DEBUG [UJrtVWxg] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13800138000(String)
15:18:18.744 DEBUG [UJrtVWxg] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 1
15:18:18.745 DEBUG [UJrtVWxg] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.745 DEBUG [UJrtVWxg] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.744899400(LocalDateTime), 127.0.0.1(String), 2(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.747 DEBUG [UJrtVWxg] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.748 DEBUG [UJrtVWxg] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.748 DEBUG [UJrtVWxg] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.744899400(LocalDateTime), 127.0.0.1(String), 3(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.751 DEBUG [UJrtVWxg] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.751 DEBUG [UJrtVWxg] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:18.751 DEBUG [UJrtVWxg] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:18.752 DEBUG [UJrtVWxg] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:18.752 DEBUG [UJrtVWxg] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:18.752 DEBUG [UJrtVWxg] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:18.753 DEBUG [UJrtVWxg] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:18.753 DEBUG [UJrtVWxg] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:18.753 DEBUG [UJrtVWxg] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:18.754 DEBUG [UJrtVWxg] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:18.755 DEBUG [UJrtVWxg] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.755 DEBUG [UJrtVWxg] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580609908088833(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.754949300(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.755516900(LocalDateTime)
15:18:18.757 DEBUG [UJrtVWxg] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:18.757 DEBUG [UJrtVWxg] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:18:18.761 DEBUG [UJrtVWxg] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 20ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","code":"123456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"UJrtVWxg", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MywidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.KXxF-QJWZK9ODQu0tjI80EEwYBFdSxVaW6a1GRMZxheEP__hOeJIHArTx5NVsvg_YpNwfkckhuaWl06Lu7lvdw","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698761}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.762  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
15:18:18.762 DEBUG [ybGBKDTr] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-account/list | IP: 127.0.0.1
15:18:18.763 DEBUG [ybGBKDTr] [1] [        main] c.x.u.m.P.selectByUserId       : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
15:18:18.763 DEBUG [ybGBKDTr] [1] [        main] c.x.u.m.P.selectByUserId       : ==> Parameters: 1(Long)
15:18:18.765 DEBUG [ybGBKDTr] [1] [        main] c.x.u.m.P.selectByUserId       : <==      Total: 2
15:18:18.766 DEBUG [ybGBKDTr] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-account/list 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/platform-account/list
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MywidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.KXxF-QJWZK9ODQu0tjI80EEwYBFdSxVaW6a1GRMZxheEP__hOeJIHArTx5NVsvg_YpNwfkckhuaWl06Lu7lvdw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ybGBKDTr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":2072580609778065409,"platformCode":"yaobangmang","platformName":"药帮忙","account":"139****9000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:18:19"},{"id":2072580609580933121,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:18:19"}],"timestamp":1782976698766}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.767  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 查询已绑定平台列表成功
15:18:18.770 DEBUG [9UX3t5ML] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:18:18.773 DEBUG [9UX3t5ML] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:18:18.773 DEBUG [9UX3t5ML] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13800138000(String)
15:18:18.774 DEBUG [9UX3t5ML] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 1
15:18:18.775 DEBUG [9UX3t5ML] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.775 DEBUG [9UX3t5ML] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.775316100(LocalDateTime), 127.0.0.1(String), 3(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.778 DEBUG [9UX3t5ML] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.779 DEBUG [9UX3t5ML] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.779 DEBUG [9UX3t5ML] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.775316100(LocalDateTime), 127.0.0.1(String), 4(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.782 DEBUG [9UX3t5ML] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.782 DEBUG [9UX3t5ML] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:18.782 DEBUG [9UX3t5ML] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:18.784 DEBUG [9UX3t5ML] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:18.784 DEBUG [9UX3t5ML] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:18.784 DEBUG [9UX3t5ML] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:18.786 DEBUG [9UX3t5ML] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:18.787 DEBUG [9UX3t5ML] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:18.787 DEBUG [9UX3t5ML] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:18.788 DEBUG [9UX3t5ML] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:18.789 DEBUG [9UX3t5ML] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.789 DEBUG [9UX3t5ML] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580610033917953(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.788622300(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.789196100(LocalDateTime)
15:18:18.791 DEBUG [9UX3t5ML] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:18.791 DEBUG [9UX3t5ML] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:18:18.796 DEBUG [9UX3t5ML] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 26ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","code":"123456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"9UX3t5ML", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NCwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.xM1I0C2HL9PhlFQcD0wBJEvrghajoFjIdQUqIJLb-05YiF9zavw4Eq4nXHM3QR3F3lmRMj5aiwGeNea_B0--gQ","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698795}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.796  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
15:18:18.797 DEBUG [YqNEnEZs] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/verify/yaoshibang | IP: 127.0.0.1
15:18:18.799 DEBUG [YqNEnEZs] [1] [        main] .u.m.P.selectByUserAndPlatform : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
15:18:18.799 DEBUG [YqNEnEZs] [1] [        main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
15:18:18.800 DEBUG [YqNEnEZs] [1] [        main] .u.m.P.selectByUserAndPlatform : <==      Total: 1
15:18:18.801  INFO [YqNEnEZs] [1] [        main] c.x.u.s.PlatformAccountService : 模拟验证平台账号: platform=yaoshibang, account=13800138000
15:18:18.801 DEBUG [YqNEnEZs] [1] [        main] c.x.u.m.P.updateById           : ==>  Preparing: UPDATE t_platform_account SET user_id=?, platform_code=?, platform_name=?, account_encrypted=?, password_encrypted=?, enabled=?, last_verify_time=?, verify_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.801 DEBUG [YqNEnEZs] [1] [        main] c.x.u.m.P.updateById           : ==> Parameters: 1(Long), yaoshibang(String), 药师帮(String), J2sm/7ZSTEqpVLqnb0gvOFtbl0szwzM7HQcFw5LUobJDO5xznMr1(String), 8OvI7mta/feZVi3l9erAmiyoGmhnhKliclHj5m4lXHhKKwRWC8KBbVCN3GuA(String), true(Boolean), 2026-07-02T15:18:18.801520200(LocalDateTime), SUCCESS(String), 2026-07-02T15:18:19(LocalDateTime), 2026-07-02T15:18:18.801520200(LocalDateTime), 2072580609580933121(Long)
15:18:18.802 DEBUG [YqNEnEZs] [1] [        main] c.x.u.m.P.updateById           : <==    Updates: 1
15:18:18.808 DEBUG [YqNEnEZs] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.808 DEBUG [YqNEnEZs] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580610168135681(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.807318500(LocalDateTime), ACCOUNT(String), VERIFY(String), 验证B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.807863800(LocalDateTime)
15:18:18.813 DEBUG [YqNEnEZs] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:18.813 DEBUG [YqNEnEZs] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 验证B2B平台账号
15:18:18.813 DEBUG [YqNEnEZs] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/verify/yaoshibang 200 16ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/platform-account/verify/yaoshibang
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NCwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.xM1I0C2HL9PhlFQcD0wBJEvrghajoFjIdQUqIJLb-05YiF9zavw4Eq4nXHM3QR3F3lmRMj5aiwGeNea_B0--gQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#verifyAccount(String, Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"YqNEnEZs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698813}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.814  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 验证药师帮账号成功
15:18:18.816 DEBUG [eT8bfwNn] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:18:18.818 DEBUG [eT8bfwNn] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:18:18.818 DEBUG [eT8bfwNn] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13800138000(String)
15:18:18.820 DEBUG [eT8bfwNn] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 1
15:18:18.821 DEBUG [eT8bfwNn] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.821 DEBUG [eT8bfwNn] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.820569300(LocalDateTime), 127.0.0.1(String), 4(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.822 DEBUG [eT8bfwNn] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.823 DEBUG [eT8bfwNn] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.823 DEBUG [eT8bfwNn] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.820569300(LocalDateTime), 127.0.0.1(String), 5(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.825 DEBUG [eT8bfwNn] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.825 DEBUG [eT8bfwNn] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:18.825 DEBUG [eT8bfwNn] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:18.826 DEBUG [eT8bfwNn] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:18.826 DEBUG [eT8bfwNn] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:18.826 DEBUG [eT8bfwNn] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:18.827 DEBUG [eT8bfwNn] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:18.827 DEBUG [eT8bfwNn] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:18.827 DEBUG [eT8bfwNn] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:18.829 DEBUG [eT8bfwNn] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:18.829 DEBUG [eT8bfwNn] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.829 DEBUG [eT8bfwNn] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580610231050242(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.829042500(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.829569300(LocalDateTime)
15:18:18.831 DEBUG [eT8bfwNn] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:18.831 DEBUG [eT8bfwNn] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:18:18.836 DEBUG [eT8bfwNn] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 20ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","code":"123456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"eT8bfwNn", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.UE-x2-S3wlUv2swkDidbQ-u0YL1uNEOR7tjmBMnGqKNbGguY9tf93v5b1-yWhDAqi8PG3lWFLnzNbx97H7ZXOg","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698835}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.836  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
15:18:18.838 DEBUG [Jdt4Yhu7] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind | IP: 127.0.0.1
15:18:18.840 DEBUG [Jdt4Yhu7] [1] [        main] .u.m.P.selectByUserAndPlatform : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
15:18:18.840 DEBUG [Jdt4Yhu7] [1] [        main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
15:18:18.841 DEBUG [Jdt4Yhu7] [1] [        main] .u.m.P.selectByUserAndPlatform : <==      Total: 1
15:18:18.842 DEBUG [Jdt4Yhu7] [1] [        main] c.x.u.m.P.updateById           : ==>  Preparing: UPDATE t_platform_account SET user_id=?, platform_code=?, platform_name=?, account_encrypted=?, password_encrypted=?, enabled=?, last_verify_time=?, verify_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.842 DEBUG [Jdt4Yhu7] [1] [        main] c.x.u.m.P.updateById           : ==> Parameters: 1(Long), yaoshibang(String), 药师帮(String), eTLZ7BtpQL4iRytYjd1isaCnWC0AgU+gBaIPOM+fTQru3S3O4dxV(String), O4+Vpgl6MXtWHXdN3NMWfe3SXk+l3irnsh/4A9yhfW20tAAQUKapMsvtK/k=(String), true(Boolean), 2026-07-02T15:18:19(LocalDateTime), PENDING(String), 2026-07-02T15:18:19(LocalDateTime), 2026-07-02T15:18:18.842388900(LocalDateTime), 2072580609580933121(Long)
15:18:18.844 DEBUG [Jdt4Yhu7] [1] [        main] c.x.u.m.P.updateById           : <==    Updates: 1
15:18:18.844  INFO [Jdt4Yhu7] [1] [        main] c.x.u.s.PlatformAccountService : 更新平台账号绑定: userId=1, platform=yaoshibang
15:18:18.849 DEBUG [Jdt4Yhu7] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.849 DEBUG [Jdt4Yhu7] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580610293964802(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.849125400(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.849125400(LocalDateTime)
15:18:18.853 DEBUG [Jdt4Yhu7] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:18.853 DEBUG [Jdt4Yhu7] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
15:18:18.854 DEBUG [Jdt4Yhu7] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind 200 16ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/platform-account/bind
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.UE-x2-S3wlUv2swkDidbQ-u0YL1uNEOR7tjmBMnGqKNbGguY9tf93v5b1-yWhDAqi8PG3lWFLnzNbx97H7ZXOg", Content-Length:"110"]
             Body = {"platformCode":"yaoshibang","platformName":"药师帮","account":"13800138000","password":"new_password_789"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Jdt4Yhu7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698853}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.854  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 更新药师帮账号成功
15:18:18.856 DEBUG [u8JLQDX9] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:18:18.859 DEBUG [u8JLQDX9] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:18:18.859 DEBUG [u8JLQDX9] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13800138000(String)
15:18:18.861 DEBUG [u8JLQDX9] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 1
15:18:18.861 DEBUG [u8JLQDX9] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.861 DEBUG [u8JLQDX9] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.861310300(LocalDateTime), 127.0.0.1(String), 5(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.863 DEBUG [u8JLQDX9] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.864 DEBUG [u8JLQDX9] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.864 DEBUG [u8JLQDX9] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.861310300(LocalDateTime), 127.0.0.1(String), 6(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.867 DEBUG [u8JLQDX9] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.867 DEBUG [u8JLQDX9] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:18.867 DEBUG [u8JLQDX9] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:18.868 DEBUG [u8JLQDX9] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:18.868 DEBUG [u8JLQDX9] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:18.868 DEBUG [u8JLQDX9] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:18.869 DEBUG [u8JLQDX9] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:18.870 DEBUG [u8JLQDX9] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:18.870 DEBUG [u8JLQDX9] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:18.871 DEBUG [u8JLQDX9] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:18.871 DEBUG [u8JLQDX9] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.872 DEBUG [u8JLQDX9] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580610423988226(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.871940900(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.871940900(LocalDateTime)
15:18:18.874 DEBUG [u8JLQDX9] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:18.874 DEBUG [u8JLQDX9] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:18:18.879 DEBUG [u8JLQDX9] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 23ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","code":"123456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"u8JLQDX9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.KmK1NZ58AepoGq6DaQpIjI9ok983TgnnOtGRFz04U3UATRT4fyggqaAK4Q_7f_uja1_l1Xd-Uso0aoihxp9AXw","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698878}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.879  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
15:18:18.880 DEBUG [r5Kmvttv] [] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/platform-account/unbind/yaobangmang | IP: 127.0.0.1
15:18:18.882 DEBUG [r5Kmvttv] [1] [        main] .u.m.P.selectByUserAndPlatform : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
15:18:18.882 DEBUG [r5Kmvttv] [1] [        main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaobangmang(String)
15:18:18.884 DEBUG [r5Kmvttv] [1] [        main] .u.m.P.selectByUserAndPlatform : <==      Total: 1
15:18:18.884 DEBUG [r5Kmvttv] [1] [        main] c.x.u.m.P.updateById           : ==>  Preparing: UPDATE t_platform_account SET user_id=?, platform_code=?, platform_name=?, account_encrypted=?, password_encrypted=?, enabled=?, verify_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.884 DEBUG [r5Kmvttv] [1] [        main] c.x.u.m.P.updateById           : ==> Parameters: 1(Long), yaobangmang(String), 药帮忙(String), W5i1KGnIoNTqUu/icmspS7Xo45EnvfLSUzIDw/LlTYpOKLQ5HN/G(String), qfShZ0DvC/AhrMANC03BDbOqZ32FbTCRVQTBjX7ajT85NU+Ef98yhkf0QsUv(String), false(Boolean), PENDING(String), 2026-07-02T15:18:19(LocalDateTime), 2026-07-02T15:18:18.884322700(LocalDateTime), 2072580609778065409(Long)
15:18:18.886 DEBUG [r5Kmvttv] [1] [        main] c.x.u.m.P.updateById           : <==    Updates: 1
15:18:18.886  INFO [r5Kmvttv] [1] [        main] c.x.u.s.PlatformAccountService : 解绑平台账号: userId=1, platform=yaobangmang
15:18:18.891 DEBUG [r5Kmvttv] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.891 DEBUG [r5Kmvttv] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580610491097089(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.891117800(LocalDateTime), ACCOUNT(String), UNBIND(String), 解绑B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaobangmang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.891117800(LocalDateTime)
15:18:18.896 DEBUG [r5Kmvttv] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:18.896 DEBUG [r5Kmvttv] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 解绑B2B平台账号
15:18:18.897 DEBUG [r5Kmvttv] [1] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/platform-account/unbind/yaobangmang 200 17ms

MockHttpServletRequest:
      HTTP Method = DELETE
      Request URI = /api/platform-account/unbind/yaobangmang
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.KmK1NZ58AepoGq6DaQpIjI9ok983TgnnOtGRFz04U3UATRT4fyggqaAK4Q_7f_uja1_l1Xd-Uso0aoihxp9AXw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#unbindAccount(String, Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"r5Kmvttv", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698896}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.897 DEBUG [kY3LaxFj] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-account/list | IP: 127.0.0.1
15:18:18.898 DEBUG [kY3LaxFj] [1] [        main] c.x.u.m.P.selectByUserId       : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
15:18:18.898 DEBUG [kY3LaxFj] [1] [        main] c.x.u.m.P.selectByUserId       : ==> Parameters: 1(Long)
15:18:18.901 DEBUG [kY3LaxFj] [1] [        main] c.x.u.m.P.selectByUserId       : <==      Total: 1
15:18:18.901 DEBUG [kY3LaxFj] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-account/list 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/platform-account/list
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.KmK1NZ58AepoGq6DaQpIjI9ok983TgnnOtGRFz04U3UATRT4fyggqaAK4Q_7f_uja1_l1Xd-Uso0aoihxp9AXw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"kY3LaxFj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":2072580609580933121,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":"2026-07-02 15:18:19","failReason":null,"createTime":"2026-07-02 15:18:19"}],"timestamp":1782976698901}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.901  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 解绑药帮忙账号成功
15:18:18.904 DEBUG [jHXHRgYF] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:18:18.908 DEBUG [jHXHRgYF] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:18:18.908 DEBUG [jHXHRgYF] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13800138000(String)
15:18:18.909 DEBUG [jHXHRgYF] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 1
15:18:18.909 DEBUG [jHXHRgYF] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.909 DEBUG [jHXHRgYF] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.909646800(LocalDateTime), 127.0.0.1(String), 6(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.912 DEBUG [jHXHRgYF] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.913 DEBUG [jHXHRgYF] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.913 DEBUG [jHXHRgYF] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.909646800(LocalDateTime), 127.0.0.1(String), 7(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.915 DEBUG [jHXHRgYF] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.916 DEBUG [jHXHRgYF] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:18.916 DEBUG [jHXHRgYF] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:18.917 DEBUG [jHXHRgYF] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:18.917 DEBUG [jHXHRgYF] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:18.917 DEBUG [jHXHRgYF] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:18.918 DEBUG [jHXHRgYF] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:18.919 DEBUG [jHXHRgYF] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:18.919 DEBUG [jHXHRgYF] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:18.920 DEBUG [jHXHRgYF] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:18.920 DEBUG [jHXHRgYF] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.921 DEBUG [jHXHRgYF] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580610616926209(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.920808800(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.920808800(LocalDateTime)
15:18:18.923 DEBUG [jHXHRgYF] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:18.923 DEBUG [jHXHRgYF] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:18:18.928 DEBUG [jHXHRgYF] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 24ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","code":"123456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"jHXHRgYF", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NywidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.istz5LEYsFTQufiGJvqqDC0G5Z3nO9S-JcT_h4he_J8gH3UYV0qPG1T_zzrYcqgt9BJRHKJvuNMW7UEt5XiubQ","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698927}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.928  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
15:18:18.929 DEBUG [hzYm5FUP] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind | IP: 127.0.0.1
15:18:18.932 DEBUG [hzYm5FUP] [1] [        main] .u.m.P.selectByUserAndPlatform : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
15:18:18.932 DEBUG [hzYm5FUP] [1] [        main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), unsupported_platform(String)
15:18:18.933 DEBUG [hzYm5FUP] [1] [        main] .u.m.P.selectByUserAndPlatform : <==      Total: 0
15:18:18.934 DEBUG [hzYm5FUP] [1] [        main] c.x.u.m.P.insert               : ==>  Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.934 DEBUG [hzYm5FUP] [1] [        main] c.x.u.m.P.insert               : ==> Parameters: 2072580610679840769(Long), 1(Long), unsupported_platform(String), 不支持的平台(String), YJpj1qk8KnJ3j/yvfvf1bgxlC8HLutOnlPKUNl39MEMaySZq6YsN(String), 2TqsoAnOasdeXWnh9SFdlxPP7bcRZ4X8K61edFBGmE93OjJP(String), true(Boolean), PENDING(String), 2026-07-02T15:18:18.934097600(LocalDateTime), 2026-07-02T15:18:18.934097600(LocalDateTime)
15:18:18.936 DEBUG [hzYm5FUP] [1] [        main] c.x.u.m.P.insert               : <==    Updates: 1
15:18:18.936  INFO [hzYm5FUP] [1] [        main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=unsupported_platform
15:18:18.941 DEBUG [hzYm5FUP] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.941 DEBUG [hzYm5FUP] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580610679840770(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.940934600(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:unsupported_platform(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.941462800(LocalDateTime)
15:18:18.946 DEBUG [hzYm5FUP] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:18.946 DEBUG [hzYm5FUP] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
15:18:18.946 DEBUG [hzYm5FUP] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/bind 200 17ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/platform-account/bind
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NywidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.istz5LEYsFTQufiGJvqqDC0G5Z3nO9S-JcT_h4he_J8gH3UYV0qPG1T_zzrYcqgt9BJRHKJvuNMW7UEt5XiubQ", Content-Length:"121"]
             Body = {"platformCode":"unsupported_platform","platformName":"不支持的平台","account":"13800138000","password":"password"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"hzYm5FUP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698946}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.947  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 不支持的平台拦截正确
15:18:18.949 DEBUG [5Nvu4Vkj] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:18:18.953 DEBUG [5Nvu4Vkj] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:18:18.953 DEBUG [5Nvu4Vkj] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13800138000(String)
15:18:18.955 DEBUG [5Nvu4Vkj] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 1
15:18:18.955 DEBUG [5Nvu4Vkj] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.955 DEBUG [5Nvu4Vkj] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.955185600(LocalDateTime), 127.0.0.1(String), 7(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.958 DEBUG [5Nvu4Vkj] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.958 DEBUG [5Nvu4Vkj] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.959 DEBUG [5Nvu4Vkj] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.955185600(LocalDateTime), 127.0.0.1(String), 8(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.962 DEBUG [5Nvu4Vkj] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.962 DEBUG [5Nvu4Vkj] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:18.962 DEBUG [5Nvu4Vkj] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:18.963 DEBUG [5Nvu4Vkj] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:18.963 DEBUG [5Nvu4Vkj] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:18.963 DEBUG [5Nvu4Vkj] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:18.965 DEBUG [5Nvu4Vkj] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:18.966 DEBUG [5Nvu4Vkj] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:18.966 DEBUG [5Nvu4Vkj] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:18.967 DEBUG [5Nvu4Vkj] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:18.967 DEBUG [5Nvu4Vkj] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:18.967 DEBUG [5Nvu4Vkj] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580610805669890(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.967578700(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.967578700(LocalDateTime)
15:18:18.969 DEBUG [5Nvu4Vkj] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:18.969 DEBUG [5Nvu4Vkj] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:18:18.973 DEBUG [5Nvu4Vkj] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 24ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","code":"123456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"5Nvu4Vkj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6OCwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.QJv_fCsES6RTbK5dhapWrF51cctfE_YkJM6suH99PoD0TKzyrby1B7X3I7DmfMaGG8RC9Lag1ZpHFyHQAn68QQ","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698973}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.974  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
15:18:18.974 DEBUG [ryyFs8WZ] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/verify/yiyaocheng | IP: 127.0.0.1
15:18:18.977 DEBUG [ryyFs8WZ] [1] [        main] .u.m.P.selectByUserAndPlatform : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
15:18:18.977 DEBUG [ryyFs8WZ] [1] [        main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yiyaocheng(String)
15:18:18.978 DEBUG [ryyFs8WZ] [1] [        main] .u.m.P.selectByUserAndPlatform : <==      Total: 0
15:18:18.982  WARN [ryyFs8WZ] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=400, message=未找到该平台的绑定记录
15:18:18.982 DEBUG [ryyFs8WZ] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/platform-account/verify/yiyaocheng 200 8ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/platform-account/verify/yiyaocheng
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6OCwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.QJv_fCsES6RTbK5dhapWrF51cctfE_YkJM6suH99PoD0TKzyrby1B7X3I7DmfMaGG8RC9Lag1ZpHFyHQAn68QQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#verifyAccount(String, Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ryyFs8WZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"未找到该平台的绑定记录","data":null,"timestamp":1782976698982}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:18.983  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 未绑定平台验证返回业务错误
15:18:18.985 DEBUG [UFmngGya] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:18:18.989 DEBUG [UFmngGya] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:18:18.989 DEBUG [UFmngGya] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13800138000(String)
15:18:18.990 DEBUG [UFmngGya] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 1
15:18:18.991 DEBUG [UFmngGya] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.991 DEBUG [UFmngGya] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.990807100(LocalDateTime), 127.0.0.1(String), 8(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.993 DEBUG [UFmngGya] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.994 DEBUG [UFmngGya] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:18.994 DEBUG [UFmngGya] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.990807100(LocalDateTime), 127.0.0.1(String), 9(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:18.996 DEBUG [UFmngGya] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:18.996 DEBUG [UFmngGya] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:18.996 DEBUG [UFmngGya] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:18.998 DEBUG [UFmngGya] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:18.998 DEBUG [UFmngGya] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:18.998 DEBUG [UFmngGya] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:18.999 DEBUG [UFmngGya] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:18.999 DEBUG [UFmngGya] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:18.999 DEBUG [UFmngGya] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:19.001 DEBUG [UFmngGya] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:19.001 DEBUG [UFmngGya] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:19.001 DEBUG [UFmngGya] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580610935693314(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:19.001294700(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:19.001827200(LocalDateTime)
15:18:19.003 DEBUG [UFmngGya] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:19.003 DEBUG [UFmngGya] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:18:19.008 DEBUG [UFmngGya] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 23ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","code":"123456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"UFmngGya", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6OSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.HuvvCZX3pAUCTJnN8puEB46Sg6mHFayJKTOx6LdrZwT4DZkgksmGn3tTKTFZQgw4hvY94AqZq7qhxisI3kSmnA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976699008}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:19.009  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
15:18:19.009 DEBUG [ysMB3RMd] [] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/platform-account/unbind/yiyaocheng | IP: 127.0.0.1
15:18:19.011 DEBUG [ysMB3RMd] [1] [        main] .u.m.P.selectByUserAndPlatform : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
15:18:19.011 DEBUG [ysMB3RMd] [1] [        main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yiyaocheng(String)
15:18:19.012 DEBUG [ysMB3RMd] [1] [        main] .u.m.P.selectByUserAndPlatform : <==      Total: 0
15:18:19.014  WARN [ysMB3RMd] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=400, message=未找到该平台的绑定记录
15:18:19.015 DEBUG [ysMB3RMd] [1] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/platform-account/unbind/yiyaocheng 200 6ms

MockHttpServletRequest:
      HTTP Method = DELETE
      Request URI = /api/platform-account/unbind/yiyaocheng
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6OSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.HuvvCZX3pAUCTJnN8puEB46Sg6mHFayJKTOx6LdrZwT4DZkgksmGn3tTKTFZQgw4hvY94AqZq7qhxisI3kSmnA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#unbindAccount(String, Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ysMB3RMd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"未找到该平台的绑定记录","data":null,"timestamp":1782976699014}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:19.015  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 未绑定平台解绑拦截正确
15:18:19.017 DEBUG [QTRb8JHd] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:18:19.021 DEBUG [QTRb8JHd] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:18:19.021 DEBUG [QTRb8JHd] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13800138000(String)
15:18:19.022 DEBUG [QTRb8JHd] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 1
15:18:19.022 DEBUG [QTRb8JHd] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:19.023 DEBUG [QTRb8JHd] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:19.022822700(LocalDateTime), 127.0.0.1(String), 9(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:19.024 DEBUG [QTRb8JHd] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:19.025 DEBUG [QTRb8JHd] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:19.026 DEBUG [QTRb8JHd] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:19.022822700(LocalDateTime), 127.0.0.1(String), 10(Long), cd2f71e5af2806c30293121700ab911b13562980e6f8fafd637d0966100aed76(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
15:18:19.027 DEBUG [QTRb8JHd] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:19.028 DEBUG [QTRb8JHd] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:19.028 DEBUG [QTRb8JHd] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:19.029 DEBUG [QTRb8JHd] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:19.029 DEBUG [QTRb8JHd] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:19.029 DEBUG [QTRb8JHd] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:19.030 DEBUG [QTRb8JHd] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:19.030 DEBUG [QTRb8JHd] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:19.031 DEBUG [QTRb8JHd] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:19.031 DEBUG [QTRb8JHd] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:19.032 DEBUG [QTRb8JHd] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:19.032 DEBUG [QTRb8JHd] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580611065716737(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:19.031979900(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:19.032775(LocalDateTime)
15:18:19.034 DEBUG [QTRb8JHd] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:19.034 DEBUG [QTRb8JHd] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:18:19.041 DEBUG [QTRb8JHd] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 24ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","code":"123456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"QTRb8JHd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MTAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTksImV4cCI6MTc4MzA2MzA5OX0.SiUJWJbdfidNKaVg1_0CyTMJFA1bRjZbVovLNGF4Qd_JTTLf-K1OCeL-dwfmTuL_Xs4lOKHiIuJe4vVw5H5U9w","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OSwiZXhwIjoxNzgzNTgxNDk5fQ.D1knOvZlE1Rat8TI9bg9v9K7__kxnb4CHVR0gdAS5YQ192dDEO2Dtj7iiLi02rMkXBSD4CKpNI_-5RRMlEC7yg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976699038}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:19.041  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
15:18:19.041 DEBUG [AZepQ8sh] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-account/list | IP: 127.0.0.1
15:18:19.042 DEBUG [AZepQ8sh] [1] [        main] c.x.u.m.P.selectByUserId       : ==>  Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
15:18:19.042 DEBUG [AZepQ8sh] [1] [        main] c.x.u.m.P.selectByUserId       : ==> Parameters: 1(Long)
15:18:19.044 DEBUG [AZepQ8sh] [1] [        main] c.x.u.m.P.selectByUserId       : <==      Total: 2
15:18:19.044 DEBUG [AZepQ8sh] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-account/list 200 3ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/platform-account/list
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MTAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTksImV4cCI6MTc4MzA2MzA5OX0.SiUJWJbdfidNKaVg1_0CyTMJFA1bRjZbVovLNGF4Qd_JTTLf-K1OCeL-dwfmTuL_Xs4lOKHiIuJe4vVw5H5U9w"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.PlatformAccountController
           Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"AZepQ8sh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":2072580610679840769,"platformCode":"unsupported_platform","platformName":"不支持的平台","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:18:19"},{"id":2072580609580933121,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":"2026-07-02 15:18:19","failReason":null,"createTime":"2026-07-02 15:18:19"}],"timestamp":1782976699044}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:19.046  INFO [] [] [        main] x.g.PlatformAccountBindingTest : ? 账号脱敏验证通过: 138****8000
[INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.517 s -- in com.xuekairui.gateway.PlatformAccountBindingTest
[INFO] Running 安全访问控制测试
15:18:19.049  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest]: SecurityAccessTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:19.050  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest
[INFO] Running HTTP 方法验证
15:18:22.009  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest$HttpMethodValidation]: HttpMethodValidation does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:22.010  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest$HttpMethodValidation
15:18:22.013 DEBUG [MEMwM3fn] [] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/membership/levels | IP: 127.0.0.1
15:18:22.015 ERROR [MEMwM3fn] [] [        main] c.x.h.GlobalExceptionHandler   : 系统异常

org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' is not supported
	at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:267)
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:441)
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:382)
	at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:127)
	at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:68)
	at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:509)
	at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1284)
	at org.springframework.test.web.servlet.TestDispatcherServlet.getHandler(TestDispatcherServlet.java:123)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1065)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
	at org.springframework.web.servlet.FrameworkServlet.doDelete(FrameworkServlet.java:936)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:596)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
	at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:165)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
	at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
	at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:490)
	at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:351)
	at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:83)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:129)
	at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:101)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:125)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at com.xuekairui.user.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:143)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
	at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:334)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:225)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:52)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
	at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebSecurityConfiguration.java:319)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$4(HandlerMappingIntrospector.java:267)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
	at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:240)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at com.xuekairui.gateway.filter.RateLimitFilter.doFilterInternal(RateLimitFilter.java:56)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at com.xuekairui.gateway.filter.RequestLoggingFilter.doFilterInternal(RequestLoggingFilter.java:79)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:201)
	at com.xuekairui.gateway.SecurityAccessTest$HttpMethodValidation.levelList_deleteMethodShouldReturn405(SecurityAccessTest.java:406)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:775)
	at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:479)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:216)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:212)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85)
	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
	at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)
	at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
	at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)
	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
	at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithoutCancellationToken(LauncherAdapter.java:60)
	at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:52)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
	at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
	at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)

15:18:22.016  WARN [MEMwM3fn] [] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/membership/levels 500 3ms

MockHttpServletRequest:
      HTTP Method = DELETE
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.HttpRequestMethodNotSupportedException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 500
    Error message = null
          Headers = [X-Request-Id:"MEMwM3fn", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":500,"message":"系统繁忙，请稍后重试","data":null,"timestamp":1782976702016}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.019 DEBUG [wTc7EqMQ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/sms/send | IP: 127.0.0.1
15:18:22.020 ERROR [wTc7EqMQ] [] [        main] c.x.h.GlobalExceptionHandler   : 系统异常

org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' is not supported
	at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:267)
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:441)
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:382)
	at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:127)
	at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:68)
	at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:509)
	at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1284)
	at org.springframework.test.web.servlet.TestDispatcherServlet.getHandler(TestDispatcherServlet.java:123)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1065)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
	at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:165)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
	at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
	at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:490)
	at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:351)
	at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:83)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:129)
	at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:101)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:125)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at com.xuekairui.user.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:143)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
	at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
	at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:334)
	at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:225)
	at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:52)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
	at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebSecurityConfiguration.java:319)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$4(HandlerMappingIntrospector.java:267)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
	at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:240)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at com.xuekairui.gateway.filter.RateLimitFilter.doFilterInternal(RateLimitFilter.java:56)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at com.xuekairui.gateway.filter.RequestLoggingFilter.doFilterInternal(RequestLoggingFilter.java:79)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
	at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
	at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:201)
	at com.xuekairui.gateway.SecurityAccessTest$HttpMethodValidation.sendCode_getMethodShouldFail(SecurityAccessTest.java:399)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:775)
	at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:479)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:216)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:212)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85)
	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
	at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)
	at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
	at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)
	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
	at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithoutCancellationToken(LauncherAdapter.java:60)
	at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:52)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
	at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
	at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)

15:18:22.021  WARN [wTc7EqMQ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/sms/send 500 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/sms/send
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.HttpRequestMethodNotSupportedException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 500
    Error message = null
          Headers = [X-Request-Id:"wTc7EqMQ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":500,"message":"系统繁忙，请稍后重试","data":null,"timestamp":1782976702021}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.014 s -- in HTTP 方法验证
[INFO] Running Token 有效性验证
15:18:22.023  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest$TokenValidation]: TokenValidation does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:22.024  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest$TokenValidation
15:18:22.027 DEBUG [u75R6Apc] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my | IP: 127.0.0.1
15:18:22.028  WARN [u75R6Apc] [] [        main] c.xuekairui.user.util.JwtUtil  : JWT解析TokenLenient失败, 原因: Malformed protected header JSON: Unable to deserialize: Unexpected character ('?' (code 65533 / 0xfffd)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
 at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 1]
15:18:22.028  WARN [u75R6Apc] [] [        main] c.xuekairui.user.util.JwtUtil  : JWT解析Token失败, 原因: Malformed protected header JSON: Unable to deserialize: Unexpected character ('?' (code 65533 / 0xfffd)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
 at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 1]
15:18:22.028  WARN [u75R6Apc] [] [        main] .x.u.s.JwtAuthenticationFilter : JWT认证失败: Token无效
15:18:22.030  WARN [u75R6Apc] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my 401 3ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/my
       Parameters = {}
          Headers = [Authorization:"Bearer invalid.token.here"]
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"u75R6Apc", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702028}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.036 DEBUG [GCx37bzE] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:18:22.036 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:22.036 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:22.038 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:22.039 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:22.039 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:22.041 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:22.041 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:22.041 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:22.043 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:22.043 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:22.044 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:22.045 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:22.045 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
15:18:22.046 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.C.sumTodayUsage        : ==> Parameters: 1(Long)
15:18:22.048 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.C.sumTodayUsage        : <==      Total: 1
15:18:22.048 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
15:18:22.048 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : ==> Parameters: 1(Long)
15:18:22.049 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.C.sumMonthlyUsage      : <==      Total: 1
15:18:22.049 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==>  Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
15:18:22.049 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.C.sumYearlyUsage       : ==> Parameters: 1(Long)
15:18:22.050 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.C.sumYearlyUsage       : <==      Total: 1
15:18:22.051 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.C.selectList           : ==>  Preparing: SELECT id FROM t_coupon WHERE (type = ?)
15:18:22.051 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.C.selectList           : ==> Parameters: CRAWLER(String)
15:18:22.053 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.C.selectList           : <==      Total: 0
15:18:22.053 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==>  Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
15:18:22.053 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.C.sumAvailableQuota    : ==> Parameters: 1(Long)
15:18:22.055 DEBUG [GCx37bzE] [1] [        main] c.x.u.m.C.sumAvailableQuota    : <==      Total: 1
15:18:22.055 DEBUG [GCx37bzE] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==>  Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
15:18:22.055 DEBUG [GCx37bzE] [1] [        main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
15:18:22.057 DEBUG [GCx37bzE] [1] [        main] .u.m.C.sumAvailableQuotaByType : <==      Total: 0
15:18:22.058 DEBUG [GCx37bzE] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 200 22ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDIsImV4cCI6MTc4MzA2MzEwMn0.otEd4zTwmcm8W3ofGVOZCKCf-ptkWmG_Zu2VXf2ITC_iauEbeYvLuVAa1S_coRsmQi-JItBeYdrYEE5vpGjFhw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerController
           Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"GCx37bzE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976702057}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.061 DEBUG [sN2Tcj77] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my | IP: 127.0.0.1
15:18:22.062  WARN [sN2Tcj77] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/my
       Parameters = {}
          Headers = [Authorization:"Bearer "]
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"sN2Tcj77", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702061}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.068 DEBUG [9FXN98PV] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my | IP: 127.0.0.1
15:18:22.068 DEBUG [9FXN98PV] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:22.068 DEBUG [9FXN98PV] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:22.070 DEBUG [9FXN98PV] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:22.071 DEBUG [9FXN98PV] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:22.071 DEBUG [9FXN98PV] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:22.073 DEBUG [9FXN98PV] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:22.073 DEBUG [9FXN98PV] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my 200 5ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/my
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDIsImV4cCI6MTc4MzA2MzEwMn0.otEd4zTwmcm8W3ofGVOZCKCf-ptkWmG_Zu2VXf2ITC_iauEbeYvLuVAa1S_coRsmQi-JItBeYdrYEE5vpGjFhw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"9FXN98PV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":1,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976702073}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.080 DEBUG [Ksfvcegr] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my | IP: 127.0.0.1
15:18:22.080 DEBUG [Ksfvcegr] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:22.081 DEBUG [Ksfvcegr] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:22.082 DEBUG [Ksfvcegr] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:22.083 DEBUG [Ksfvcegr] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:22.083 DEBUG [Ksfvcegr] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:22.085 DEBUG [Ksfvcegr] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:22.085 DEBUG [Ksfvcegr] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my 200 5ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/my
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDIsImV4cCI6MTc4MzA2MzEwMn0.otEd4zTwmcm8W3ofGVOZCKCf-ptkWmG_Zu2VXf2ITC_iauEbeYvLuVAa1S_coRsmQi-JItBeYdrYEE5vpGjFhw"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Ksfvcegr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":1,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976702085}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.086 DEBUG [rqWqCjn4] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my | IP: 127.0.0.1
15:18:22.086 DEBUG [rqWqCjn4] [2] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:22.086 DEBUG [rqWqCjn4] [2] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2(Long)
15:18:22.088 DEBUG [rqWqCjn4] [2] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:22.089 DEBUG [rqWqCjn4] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:22.089 DEBUG [rqWqCjn4] [2] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
15:18:22.091 DEBUG [rqWqCjn4] [2] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:22.091 DEBUG [rqWqCjn4] [2] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my 200 5ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/my
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY3MDIsImV4cCI6MTc4MzA2MzEwMn0.PqJ0dJSGW5Ai-c-kR3wxbkt_xScrad6gi8mIkk3vMnAS9L669ed-JpFPKCRL4tEhZnmgykMxpD6qfSgjmmW6QQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"rqWqCjn4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":2,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976702091}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.071 s -- in Token 有效性验证
[INFO] Running 受保护接口 - 管理级（需要 Token）
15:18:22.094  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest$AdminEndpoints]: AdminEndpoints does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:22.095  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest$AdminEndpoints
15:18:22.099 DEBUG [bAc8fbXh] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/USER/1 | IP: 127.0.0.1
15:18:22.100  WARN [bAc8fbXh] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/target/USER/1 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/target/USER/1
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"bAc8fbXh", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702099}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.103 DEBUG [sKhaVzeB] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/rewards | IP: 127.0.0.1
15:18:22.105  WARN [sKhaVzeB] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/rewards 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/invite/rewards
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"sKhaVzeB", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702103}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.109 DEBUG [AqLf4ed9] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/config | IP: 127.0.0.1
15:18:22.112  WARN [AqLf4ed9] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/invite/config 401 3ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/invite/config
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"AqLf4ed9", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702111}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.116 DEBUG [tttxAy5f] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/trial-quota/config | IP: 127.0.0.1
15:18:22.117  WARN [tttxAy5f] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/trial-quota/config 401 1ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/trial-quota/config
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
             Body = {}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"tttxAy5f", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702116}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.120 DEBUG [bjZNAQuC] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/sensitive | IP: 127.0.0.1
15:18:22.123  WARN [bjZNAQuC] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/sensitive 401 3ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/sensitive
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"bjZNAQuC", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702122}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.127 DEBUG [WRFDHW7k] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/trial-quota/config/1 | IP: 127.0.0.1
15:18:22.128  WARN [WRFDHW7k] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/trial-quota/config/1 401 1ms

MockHttpServletRequest:
      HTTP Method = PUT
      Request URI = /api/admin/trial-quota/config/1
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
             Body = {}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"WRFDHW7k", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702128}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.133 DEBUG [vvFaU4En] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/membership/grant | IP: 127.0.0.1
15:18:22.135  WARN [vvFaU4En] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/membership/grant 401 2ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/membership/grant
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"26"]
             Body = {"userId":1,"level":"PRO"}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"vvFaU4En", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702135}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.145 DEBUG [6XSb5Ysh] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log | IP: 127.0.0.1
15:18:22.146  WARN [6XSb5Ysh] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"6XSb5Ysh", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702145}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.149 DEBUG [7bjWpegn] [] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/admin/trial-quota/config/1 | IP: 127.0.0.1
15:18:22.150  WARN [7bjWpegn] [] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/admin/trial-quota/config/1 401 1ms

MockHttpServletRequest:
      HTTP Method = DELETE
      Request URI = /api/admin/trial-quota/config/1
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"7bjWpegn", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702150}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.156 DEBUG [DLyfQv44] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/stats?module=USER | IP: 127.0.0.1
15:18:22.158  WARN [DLyfQv44] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/stats?module=USER 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/stats
       Parameters = {module=[USER]}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"DLyfQv44", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702156}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.162 DEBUG [FemZNLr8] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/invite/config | IP: 127.0.0.1
15:18:22.163  WARN [FemZNLr8] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/invite/config 401 1ms

MockHttpServletRequest:
      HTTP Method = PUT
      Request URI = /api/admin/invite/config
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
             Body = {}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"FemZNLr8", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702162}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.167 DEBUG [ZQADbf4z] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/trial-quota/configs | IP: 127.0.0.1
15:18:22.168  WARN [ZQADbf4z] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/trial-quota/configs 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/trial-quota/configs
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"ZQADbf4z", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702168}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.173 DEBUG [URagQ4gu] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/crawler/grant | IP: 127.0.0.1
15:18:22.175  WARN [URagQ4gu] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/crawler/grant 401 2ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/crawler/grant
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"28"]
             Body = {"userId":1,"quotaCount":50}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"URagQ4gu", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702175}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.178 DEBUG [RKZLWJHx] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/license/review | IP: 127.0.0.1
15:18:22.179  WARN [RKZLWJHx] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/license/review 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/license/review
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"RKZLWJHx", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702178}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.184 DEBUG [rs6KyMYP] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review | IP: 127.0.0.1
15:18:22.184  WARN [rs6KyMYP] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/license/review 401 1ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/license/review
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
             Body = {}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"rs6KyMYP", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702184}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.188 DEBUG [FLf59b87] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/grants | IP: 127.0.0.1
15:18:22.191  WARN [FLf59b87] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/crawler/grants 401 3ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/crawler/grants
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"FLf59b87", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702190}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.194 DEBUG [YC9n6sUJ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/user/1 | IP: 127.0.0.1
15:18:22.195  WARN [YC9n6sUJ] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/audit-log/user/1 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/audit-log/user/1
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"YC9n6sUJ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702195}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 17, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.104 s -- in 受保护接口 - 管理级（需要 Token）
[INFO] Running 受保护接口 - 用户级（需要 Token）
15:18:22.200  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest$ProtectedEndpoints]: ProtectedEndpoints does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:22.201  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest$ProtectedEndpoints
15:18:22.204 DEBUG [VcW5nc3e] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/stats | IP: 127.0.0.1
15:18:22.206  WARN [VcW5nc3e] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/stats 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/stats
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"VcW5nc3e", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702205}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.209 DEBUG [FuVNBWyS] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my | IP: 127.0.0.1
15:18:22.210  WARN [FuVNBWyS] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"FuVNBWyS", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702210}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.214 DEBUG [pF7ZfcHR] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my/available | IP: 127.0.0.1
15:18:22.214  WARN [pF7ZfcHR] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/coupon/my/available 401 0ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/coupon/my/available
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"pF7ZfcHR", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702214}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.218 DEBUG [TuvY4VCX] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/coupon/issue | IP: 127.0.0.1
15:18:22.219  WARN [TuvY4VCX] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/coupon/issue 401 1ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/coupon/issue
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
             Body = {}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"TuvY4VCX", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702219}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.223 DEBUG [2V9ZyeJd] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/rewards | IP: 127.0.0.1
15:18:22.225  WARN [2V9ZyeJd] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/rewards 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/rewards
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"2V9ZyeJd", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702224}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.227 DEBUG [6VGLgJAE] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my | IP: 127.0.0.1
15:18:22.229  WARN [6VGLgJAE] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/my
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"6VGLgJAE", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702229}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.233 DEBUG [SCN6sphB] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs | IP: 127.0.0.1
15:18:22.234  WARN [SCN6sphB] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/logs 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/logs
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"SCN6sphB", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702234}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.240 DEBUG [aKghyWCx] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/extra-quota | IP: 127.0.0.1
15:18:22.241  WARN [aKghyWCx] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/extra-quota 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/extra-quota
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"aKghyWCx", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702241}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.246 DEBUG [cyxkyjeT] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status | IP: 127.0.0.1
15:18:22.247  WARN [cyxkyjeT] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/crawler/status 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/crawler/status
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"cyxkyjeT", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702247}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.252 DEBUG [5G7LW2ba] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info | IP: 127.0.0.1
15:18:22.254  WARN [5G7LW2ba] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/user/info
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"5G7LW2ba", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702253}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.257 DEBUG [ZHqrNU5r] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume | IP: 127.0.0.1
15:18:22.258  WARN [ZHqrNU5r] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/crawler/consume 401 1ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/crawler/consume
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"11"]
             Body = {"count":1}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"ZHqrNU5r", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702258}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.261 DEBUG [pWLpbD2j] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/code | IP: 127.0.0.1
15:18:22.264  WARN [pWLpbD2j] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/code 401 3ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/code
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"pWLpbD2j", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976702263}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.069 s -- in 受保护接口 - 用户级（需要 Token）
[INFO] Running 公开接口（无需 Token）
15:18:22.268  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest$PublicEndpoints]: PublicEndpoints does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:22.269  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest$PublicEndpoints
15:18:22.274 DEBUG [PvLYB9bg] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels | IP: 127.0.0.1
15:18:22.275 DEBUG [PvLYB9bg] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:22.275 DEBUG [PvLYB9bg] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:22.279 DEBUG [PvLYB9bg] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:22.280 DEBUG [PvLYB9bg] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:22.280 DEBUG [PvLYB9bg] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PRO(String), 1(Integer)
15:18:22.282 DEBUG [PvLYB9bg] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:22.283 DEBUG [PvLYB9bg] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:22.283 DEBUG [PvLYB9bg] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: ULTRA(String), 1(Integer)
15:18:22.284 DEBUG [PvLYB9bg] [] [        main] c.x.u.m.M.selectList           : <==      Total: 4
15:18:22.285 DEBUG [PvLYB9bg] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels 200 11ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#listLevels()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"PvLYB9bg", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员：每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员：连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用，多店铺管理，敬请期待"}]}],"timestamp":1782976702284}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.288 DEBUG [K9PV6abE] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-config/enabled | IP: 127.0.0.1
15:18:22.289 DEBUG [K9PV6abE] [] [        main] x.u.m.P.selectEnabledPlatforms : ==>  Preparing: SELECT * FROM t_platform_config WHERE enabled = true ORDER BY priority ASC
15:18:22.289 DEBUG [K9PV6abE] [] [        main] x.u.m.P.selectEnabledPlatforms : ==> Parameters: 
15:18:22.291 DEBUG [K9PV6abE] [] [        main] x.u.m.P.selectEnabledPlatforms : <==      Total: 3
15:18:22.291 DEBUG [K9PV6abE] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/platform-config/enabled 200 3ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/platform-config/enabled
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.CrawlerPlatformConfigController
           Method = com.xuekairui.user.controller.CrawlerPlatformConfigController#getEnabledPlatforms()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"K9PV6abE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":1,"platformCode":"yaoshibang","platformName":"药师帮","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":1,"underMaintenance":false,"maintenanceNotice":null,"description":"国内最大B2B医药批发平台","officialUrl":"https://www.yaoshibang.com","bindingInstructions":"请输入您在药师帮的手机号和密码","sortOrder":1,"createTime":"2026-07-02 15:18:21","updateTime":"2026-07-02 15:18:21","createdBy":null,"updatedBy":null},{"id":2,"platformCode":"yaobangmang","platformName":"药帮忙","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":2,"underMaintenance":false,"maintenanceNotice":null,"description":"专业医药B2B采购平台","officialUrl":"https://www.yaobangmang.com","bindingInstructions":"请输入您在药帮忙的手机号和密码","sortOrder":2,"createTime":"2026-07-02 15:18:21","updateTime":"2026-07-02 15:18:21","createdBy":null,"updatedBy":null},{"id":3,"platformCode":"yiyaocheng","platformName":"1药城","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":3,"underMaintenance":false,"maintenanceNotice":null,"description":"1药网旗下B2B医药平台","officialUrl":"https://www.1yaocheng.com","bindingInstructions":"请输入您在1药城的手机号和密码","sortOrder":3,"createTime":"2026-07-02 15:18:21","updateTime":"2026-07-02 15:18:21","createdBy":null,"updatedBy":null}],"timestamp":1782976702291}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.295 DEBUG [r3CEZq9Y] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/wechat/callback | IP: 127.0.0.1
15:18:22.296 DEBUG [r3CEZq9Y] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/wechat/callback 200 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/wechat/callback
       Parameters = {code=[test], state=[login]}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#wechatCallback(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"r3CEZq9Y", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":"https://your-domain.com/wechat-login?code=test","timestamp":1782976702295}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.299 DEBUG [H7pYmavA] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send | IP: 127.0.0.1
15:18:22.300  INFO [H7pYmavA] [] [        main] .x.u.s.VerificationCodeService : 【验证码-测试模式】是否启用 true
15:18:22.302  INFO [H7pYmavA] [] [        main] .x.u.s.VerificationCodeService : 【验证码-测试模式】手机号: 138****8000, 验证码: 123456 (固定), 场景: login, 有效期: 5分钟
15:18:22.302 DEBUG [H7pYmavA] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send 200 3ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/send
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","scene":"login"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"H7pYmavA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976702302}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.306 DEBUG [EMRz69yu] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TESTCODE?channel=app | IP: 127.0.0.1
15:18:22.307 DEBUG [EMRz69yu] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
15:18:22.308 DEBUG [EMRz69yu] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: TESTCODE(String)
15:18:22.310 DEBUG [EMRz69yu] [] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:22.310  WARN [EMRz69yu] [] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=3001, message=邀请码无效
15:18:22.311 DEBUG [EMRz69yu] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TESTCODE?channel=app 200 5ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/page/TESTCODE
       Parameters = {channel=[app]}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"EMRz69yu", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976702310}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.314 DEBUG [mqqSGJAs] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels/1 | IP: 127.0.0.1
15:18:22.316 DEBUG [mqqSGJAs] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:22.316 DEBUG [mqqSGJAs] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:22.317 DEBUG [mqqSGJAs] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:22.318 DEBUG [mqqSGJAs] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/levels/1 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/levels/1
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#getLevel(Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"mqqSGJAs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},"timestamp":1782976702317}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.321 DEBUG [SQqvBCTz] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/invite/click/TESTCODE | IP: 127.0.0.1
15:18:22.322 DEBUG [SQqvBCTz] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
15:18:22.322 DEBUG [SQqvBCTz] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: TESTCODE(String)
15:18:22.324 DEBUG [SQqvBCTz] [] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:22.325 DEBUG [SQqvBCTz] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/invite/click/TESTCODE 200 4ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/invite/click/TESTCODE
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#trackClick(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"SQqvBCTz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976702324}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.328 DEBUG [A4KPtyJt] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/wechat/url | IP: 127.0.0.1
15:18:22.329 DEBUG [A4KPtyJt] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/wechat/url 200 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/wechat/url
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#getWechatUrl(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"A4KPtyJt", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":"https://open.weixin.qq.com/connect/qrconnect?appid=test_app_id&redirect_uri=http://localhost/callback&response_type=code&scope=snsapi_login&state=login#wechat_redirect","timestamp":1782976702329}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.332 DEBUG [yECnyMJ9] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TESTCODE | IP: 127.0.0.1
15:18:22.333 DEBUG [yECnyMJ9] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
15:18:22.333 DEBUG [yECnyMJ9] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: TESTCODE(String)
15:18:22.335 DEBUG [yECnyMJ9] [] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:22.336  WARN [yECnyMJ9] [] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=3001, message=邀请码无效
15:18:22.336 DEBUG [yECnyMJ9] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/page/TESTCODE 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/page/TESTCODE
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"yECnyMJ9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976702336}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.340 DEBUG [dKzbx7V2] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:18:22.343 DEBUG [dKzbx7V2] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:18:22.343 DEBUG [dKzbx7V2] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13800138000(String)
15:18:22.345 DEBUG [dKzbx7V2] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 1
15:18:22.345 DEBUG [dKzbx7V2] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
15:18:22.345 DEBUG [dKzbx7V2] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:22.345307300(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:18:21(LocalDateTime), 2026-07-02T15:18:21(LocalDateTime), 1(Long)
15:18:22.347 DEBUG [dKzbx7V2] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:22.348 DEBUG [dKzbx7V2] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:22.348 DEBUG [dKzbx7V2] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:22.345307300(LocalDateTime), 127.0.0.1(String), 1(Long), 584cdce62be1097a7c5569ad85c2e42658c81ae83065c98f423e03a30b5efcca(String), ACTIVE(String), 2026-07-02T15:18:21(LocalDateTime), 2026-07-02T15:18:21(LocalDateTime), 1(Long)
15:18:22.351 DEBUG [dKzbx7V2] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:22.351 DEBUG [dKzbx7V2] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:22.351 DEBUG [dKzbx7V2] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:22.352 DEBUG [dKzbx7V2] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:22.352 DEBUG [dKzbx7V2] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:22.352 DEBUG [dKzbx7V2] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:22.353 DEBUG [dKzbx7V2] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:22.353 DEBUG [dKzbx7V2] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:22.354 DEBUG [dKzbx7V2] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:22.355 DEBUG [dKzbx7V2] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:22.356 DEBUG [dKzbx7V2] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:22.356 DEBUG [dKzbx7V2] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580625049526274(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:22.356167800(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:22.356167800(LocalDateTime)
15:18:22.359 DEBUG [dKzbx7V2] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:22.359 DEBUG [dKzbx7V2] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:18:22.429 DEBUG [dKzbx7V2] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 89ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","code":"123456"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"dKzbx7V2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjcwMiwiZXhwIjoxNzgzMDYzMTAyfQ.YPwWBl4z33iNxLMPtxdqqSIu-B1MjUmjFC4ycglbpWlZVLP8ccTAV7oP7DCaA6pGkGZIh5R2PavrAKhDGEdaZA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjcwMiwiZXhwIjoxNzgzNTgxNTAyfQ.EGhjQrMi4Xl2n_1yU1w6aQqkHvmTvTlgS6zX7GnQVA1GCp9Bbr06N8Gu7qbsywlD8R6-jKnsS9kyA43dcqNO7Q","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:21","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976702427}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:22.433 DEBUG [FCtDnWGc] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/trial-quota/active | IP: 127.0.0.1
15:18:22.434 DEBUG [FCtDnWGc] [] [        main] .m.T.selectActiveDefaultConfig : ==>  Preparing: SELECT * FROM t_trial_quota_config WHERE config_type = 'DEFAULT' AND enabled = true AND (effective_from IS NULL OR effective_from <= ?) AND (effective_to IS NULL OR effective_to >= ?) ORDER BY create_time DESC LIMIT 1
15:18:22.434 DEBUG [FCtDnWGc] [] [        main] .m.T.selectActiveDefaultConfig : ==> Parameters: 2026-07-02T15:18:22.434347300(LocalDateTime), 2026-07-02T15:18:22.434347300(LocalDateTime)
15:18:22.437 DEBUG [FCtDnWGc] [] [        main] .m.T.selectActiveDefaultConfig : <==      Total: 0
15:18:22.437  WARN [FCtDnWGc] [] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=404, message=无生效中的体验配额配置
15:18:22.438 DEBUG [FCtDnWGc] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/trial-quota/active 200 5ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/trial-quota/active
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.TrialQuotaConfigController
           Method = com.xuekairui.user.controller.TrialQuotaConfigController#getActiveConfig()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"FCtDnWGc", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":404,"message":"无生效中的体验配额配置","data":null,"timestamp":1782976702438}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.174 s -- in 公开接口（无需 Token）
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.392 s -- in 安全访问控制测试
[INFO] Running 体验配额配置接口测试
15:18:22.442  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.TrialQuotaConfigTest]: TrialQuotaConfigTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:22.443  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.TrialQuotaConfigTest
15:18:25.826 DEBUG [NH6vSrDf] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/trial-quota/active | IP: 127.0.0.1
15:18:25.827 DEBUG [NH6vSrDf] [] [        main] .m.T.selectActiveDefaultConfig : ==>  Preparing: SELECT * FROM t_trial_quota_config WHERE config_type = 'DEFAULT' AND enabled = true AND (effective_from IS NULL OR effective_from <= ?) AND (effective_to IS NULL OR effective_to >= ?) ORDER BY create_time DESC LIMIT 1
15:18:25.827 DEBUG [NH6vSrDf] [] [        main] .m.T.selectActiveDefaultConfig : ==> Parameters: 2026-07-02T15:18:25.827477100(LocalDateTime), 2026-07-02T15:18:25.827477100(LocalDateTime)
15:18:25.830 DEBUG [NH6vSrDf] [] [        main] .m.T.selectActiveDefaultConfig : <==      Total: 0
15:18:25.830  WARN [NH6vSrDf] [] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=404, message=无生效中的体验配额配置
15:18:25.830 DEBUG [NH6vSrDf] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/trial-quota/active 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/trial-quota/active
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.TrialQuotaConfigController
           Method = com.xuekairui.user.controller.TrialQuotaConfigController#getActiveConfig()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"NH6vSrDf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":404,"message":"无生效中的体验配额配置","data":null,"timestamp":1782976705830}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:25.835 DEBUG [pVKhsG8F] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/trial-quota/configs | IP: 127.0.0.1
15:18:25.836 DEBUG [pVKhsG8F] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:25.836 DEBUG [pVKhsG8F] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:25.838 DEBUG [pVKhsG8F] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:25.839 DEBUG [pVKhsG8F] [1] [        main] c.x.u.m.T.selectList           : ==>  Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config ORDER BY create_time DESC
15:18:25.839 DEBUG [pVKhsG8F] [1] [        main] c.x.u.m.T.selectList           : ==> Parameters: 
15:18:25.840 DEBUG [pVKhsG8F] [1] [        main] c.x.u.m.T.selectList           : <==      Total: 0
15:18:25.841 DEBUG [pVKhsG8F] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/trial-quota/configs 200 6ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/trial-quota/configs
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
           Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#listConfigs()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"pVKhsG8F", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976705841}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:25.843 DEBUG [c9kaQqFg] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/trial-quota/configs | IP: 127.0.0.1
15:18:25.845  WARN [c9kaQqFg] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/admin/trial-quota/configs 401 2ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/admin/trial-quota/configs
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"c9kaQqFg", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976705844}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:25.849 DEBUG [nLYVV8M6] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/trial-quota/config | IP: 127.0.0.1
15:18:25.850 DEBUG [nLYVV8M6] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:25.850 DEBUG [nLYVV8M6] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:25.851 DEBUG [nLYVV8M6] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:25.855 DEBUG [nLYVV8M6] [1] [        main] c.x.u.m.T.insert               : ==>  Preparing: INSERT INTO t_trial_quota_config ( config_name, trial_days, daily_query_limit, monthly_watchlist_limit, enabled, config_type, applicable_user_type, current_users, priority, description, created_by, updated_by, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:25.855 DEBUG [nLYVV8M6] [1] [        main] c.x.u.m.T.insert               : ==> Parameters: 测试体验配置(String), 15(Integer), 30(Integer), 200(Integer), true(Boolean), DEFAULT(String), NEW_USER(String), 0(Integer), 1(Integer), 自动化测试创建的配置(String), 1(Long), 1(Long), 2026-07-02T15:18:25.855010600(LocalDateTime), 2026-07-02T15:18:25.855010600(LocalDateTime)
15:18:25.859 DEBUG [nLYVV8M6] [1] [        main] c.x.u.m.T.insert               : <==    Updates: 1
15:18:25.859  INFO [nLYVV8M6] [1] [        main] .x.u.s.TrialQuotaConfigService : 创建体验配额配置: id=1, name=测试体验配置
15:18:25.860 DEBUG [nLYVV8M6] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:25.860 DEBUG [nLYVV8M6] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580639700230145(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:25.860387500(LocalDateTime), TRIAL(String), CONFIG_CREATE(String), 创建体验配额配置(String), TRIAL_CONFIG(String), 1(Long), TRIAL_CONFIG:1(String), SUCCESS(String), true(Boolean), 2026-07-02T15:18:25.860387500(LocalDateTime)
15:18:25.865 DEBUG [nLYVV8M6] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:25.865  WARN [nLYVV8M6] [1] [        main] x.u.s.OperationAuditLogService : 【敏感操作】创建体验配额配置 - 操作人: 管理员(1), 目标: TRIAL_CONFIG:1, 结果: SUCCESS
15:18:25.865 DEBUG [nLYVV8M6] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 创建体验配额配置
15:18:25.866 DEBUG [nLYVV8M6] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/trial-quota/config 200 17ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/trial-quota/config
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA", Content-Length:"285"]
             Body = {
    "configName": "测试体验配置",
    "trialDays": 15,
    "dailyQueryLimit": 30,
    "monthlyWatchlistLimit": 200,
    "enabled": true,
    "configType": "DEFAULT",
    "applicableUserType": "NEW_USER",
    "priority": 1,
    "description": "自动化测试创建的配置"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
           Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#createConfig(TrialQuotaConfig, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"nLYVV8M6", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"configName":"测试体验配置","trialDays":15,"dailyQueryLimit":30,"monthlyWatchlistLimit":200,"enabled":true,"configType":"DEFAULT","applicableUserType":"NEW_USER","effectiveFrom":null,"effectiveTo":null,"maxUsers":null,"currentUsers":0,"priority":1,"description":"自动化测试创建的配置","remark":null,"createdBy":1,"updatedBy":1,"createTime":"2026-07-02 15:18:25","updateTime":"2026-07-02 15:18:25"},"timestamp":1782976705865}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:25.872 DEBUG [AfZFST97] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/trial-quota/config | IP: 127.0.0.1
15:18:25.872 DEBUG [AfZFST97] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:25.872 DEBUG [AfZFST97] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:25.874 DEBUG [AfZFST97] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:25.875 DEBUG [AfZFST97] [1] [        main] c.x.u.m.T.insert               : ==>  Preparing: INSERT INTO t_trial_quota_config ( config_name, trial_days, daily_query_limit, monthly_watchlist_limit, enabled, config_type, applicable_user_type, max_users, current_users, priority, description, created_by, updated_by, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:25.875 DEBUG [AfZFST97] [1] [        main] c.x.u.m.T.insert               : ==> Parameters: 618活动体验配置(String), 30(Integer), 50(Integer), 500(Integer), true(Boolean), ACTIVITY(String), ALL(String), 1000(Integer), 0(Integer), 10(Integer), 618活动专属体验配置(String), 1(Long), 1(Long), 2026-07-02T15:18:25.875418800(LocalDateTime), 2026-07-02T15:18:25.875418800(LocalDateTime)
15:18:25.880 DEBUG [AfZFST97] [1] [        main] c.x.u.m.T.insert               : <==    Updates: 1
15:18:25.880  INFO [AfZFST97] [1] [        main] .x.u.s.TrialQuotaConfigService : 创建体验配额配置: id=2, name=618活动体验配置
15:18:25.881 DEBUG [AfZFST97] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:25.881 DEBUG [AfZFST97] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580639830253570(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:25.880758500(LocalDateTime), TRIAL(String), CONFIG_CREATE(String), 创建体验配额配置(String), TRIAL_CONFIG(String), 2(Long), TRIAL_CONFIG:2(String), SUCCESS(String), true(Boolean), 2026-07-02T15:18:25.881291700(LocalDateTime)
15:18:25.885 DEBUG [AfZFST97] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:25.885  WARN [AfZFST97] [1] [        main] x.u.s.OperationAuditLogService : 【敏感操作】创建体验配额配置 - 操作人: 管理员(1), 目标: TRIAL_CONFIG:2, 结果: SUCCESS
15:18:25.885 DEBUG [AfZFST97] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 创建体验配额配置
15:18:25.886 DEBUG [AfZFST97] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/trial-quota/config 200 14ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/trial-quota/config
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA", Content-Length:"304"]
             Body = {
    "configName": "618活动体验配置",
    "trialDays": 30,
    "dailyQueryLimit": 50,
    "monthlyWatchlistLimit": 500,
    "enabled": true,
    "configType": "ACTIVITY",
    "applicableUserType": "ALL",
    "priority": 10,
    "maxUsers": 1000,
    "description": "618活动专属体验配置"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
           Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#createConfig(TrialQuotaConfig, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"AfZFST97", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":2,"configName":"618活动体验配置","trialDays":30,"dailyQueryLimit":50,"monthlyWatchlistLimit":500,"enabled":true,"configType":"ACTIVITY","applicableUserType":"ALL","effectiveFrom":null,"effectiveTo":null,"maxUsers":1000,"currentUsers":0,"priority":10,"description":"618活动专属体验配置","remark":null,"createdBy":1,"updatedBy":1,"createTime":"2026-07-02 15:18:25","updateTime":"2026-07-02 15:18:25"},"timestamp":1782976705885}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:25.889 DEBUG [gVbCASGV] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/trial-quota/config | IP: 127.0.0.1
15:18:25.891  WARN [gVbCASGV] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/trial-quota/config 401 2ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/trial-quota/config
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
             Body = {}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"gVbCASGV", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976705890}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:25.896 DEBUG [wnRyUL9v] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/trial-quota/config/1 | IP: 127.0.0.1
15:18:25.897 DEBUG [wnRyUL9v] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:25.897 DEBUG [wnRyUL9v] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:25.898 DEBUG [wnRyUL9v] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:25.900 DEBUG [wnRyUL9v] [1] [        main] c.x.u.m.T.selectById           : ==>  Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config WHERE id=?
15:18:25.900 DEBUG [wnRyUL9v] [1] [        main] c.x.u.m.T.selectById           : ==> Parameters: 1(Long)
15:18:25.902 DEBUG [wnRyUL9v] [1] [        main] c.x.u.m.T.selectById           : <==      Total: 1
15:18:25.904 DEBUG [wnRyUL9v] [1] [        main] c.x.u.m.T.updateById           : ==>  Preparing: UPDATE t_trial_quota_config SET config_name=?, trial_days=?, daily_query_limit=?, monthly_watchlist_limit=?, enabled=?, config_type=?, applicable_user_type=?, priority=?, description=?, updated_by=?, update_time=? WHERE id=?
15:18:25.904 DEBUG [wnRyUL9v] [1] [        main] c.x.u.m.T.updateById           : ==> Parameters: 测试体验配置（已更新）(String), 20(Integer), 40(Integer), 300(Integer), true(Boolean), DEFAULT(String), NEW_USER(String), 2(Integer), 更新后的配置(String), 1(Long), 2026-07-02T15:18:25.904166600(LocalDateTime), 1(Long)
15:18:25.908 DEBUG [wnRyUL9v] [1] [        main] c.x.u.m.T.updateById           : <==    Updates: 1
15:18:25.908 DEBUG [wnRyUL9v] [1] [        main] c.x.u.m.T.selectById           : ==>  Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config WHERE id=?
15:18:25.908 DEBUG [wnRyUL9v] [1] [        main] c.x.u.m.T.selectById           : ==> Parameters: 1(Long)
15:18:25.910 DEBUG [wnRyUL9v] [1] [        main] c.x.u.m.T.selectById           : <==      Total: 1
15:18:25.911 DEBUG [wnRyUL9v] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:25.911 DEBUG [wnRyUL9v] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580639960276993(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:25.911296700(LocalDateTime), TRIAL(String), CONFIG_UPDATE(String), 更新体验配额配置(String), TRIAL_CONFIG(String), 1(Long), TRIAL_CONFIG:1(String), SUCCESS(String), true(Boolean), 2026-07-02T15:18:25.911296700(LocalDateTime)
15:18:25.916 DEBUG [wnRyUL9v] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:25.916  WARN [wnRyUL9v] [1] [        main] x.u.s.OperationAuditLogService : 【敏感操作】更新体验配额配置 - 操作人: 管理员(1), 目标: TRIAL_CONFIG:1, 结果: SUCCESS
15:18:25.916 DEBUG [wnRyUL9v] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 更新体验配额配置
15:18:25.916 DEBUG [wnRyUL9v] [1] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/trial-quota/config/1 200 20ms

MockHttpServletRequest:
      HTTP Method = PUT
      Request URI = /api/admin/trial-quota/config/1
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA", Content-Length:"288"]
             Body = {
    "configName": "测试体验配置（已更新）",
    "trialDays": 20,
    "dailyQueryLimit": 40,
    "monthlyWatchlistLimit": 300,
    "enabled": true,
    "configType": "DEFAULT",
    "applicableUserType": "NEW_USER",
    "priority": 2,
    "description": "更新后的配置"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
           Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#updateConfig(Long, TrialQuotaConfig, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"wnRyUL9v", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"configName":"测试体验配置（已更新）","trialDays":20,"dailyQueryLimit":40,"monthlyWatchlistLimit":300,"enabled":true,"configType":"DEFAULT","applicableUserType":"NEW_USER","effectiveFrom":null,"effectiveTo":null,"maxUsers":null,"currentUsers":0,"priority":2,"description":"更新后的配置","remark":null,"createdBy":1,"updatedBy":1,"createTime":"2026-07-02 15:18:26","updateTime":"2026-07-02 15:18:26"},"timestamp":1782976705916}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:25.922 DEBUG [CtA77fKC] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/trial-quota/config/9999 | IP: 127.0.0.1
15:18:25.922 DEBUG [CtA77fKC] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:25.923 DEBUG [CtA77fKC] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:25.924 DEBUG [CtA77fKC] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:25.925 DEBUG [CtA77fKC] [1] [        main] c.x.u.m.T.selectById           : ==>  Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config WHERE id=?
15:18:25.925 DEBUG [CtA77fKC] [1] [        main] c.x.u.m.T.selectById           : ==> Parameters: 9999(Long)
15:18:25.927 DEBUG [CtA77fKC] [1] [        main] c.x.u.m.T.selectById           : <==      Total: 0
15:18:25.928  WARN [CtA77fKC] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=404, message=体验配额配置不存在
15:18:25.928 DEBUG [CtA77fKC] [1] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/trial-quota/config/9999 200 6ms

MockHttpServletRequest:
      HTTP Method = PUT
      Request URI = /api/admin/trial-quota/config/9999
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA", Content-Length:"213"]
             Body = {
    "configName": "不存在的配置",
    "trialDays": 15,
    "dailyQueryLimit": 20,
    "monthlyWatchlistLimit": 100,
    "enabled": true,
    "configType": "DEFAULT",
    "applicableUserType": "NEW_USER"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
           Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#updateConfig(Long, TrialQuotaConfig, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"CtA77fKC", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":404,"message":"体验配额配置不存在","data":null,"timestamp":1782976705928}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:25.931 DEBUG [JPUPEeF4] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/trial-quota/config/1 | IP: 127.0.0.1
15:18:25.933  WARN [JPUPEeF4] [] [        main] c.x.g.f.RequestLoggingFilter   : PUT /api/admin/trial-quota/config/1 401 2ms

MockHttpServletRequest:
      HTTP Method = PUT
      Request URI = /api/admin/trial-quota/config/1
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
             Body = {}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"JPUPEeF4", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976705933}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:25.938 DEBUG [S2Qx5MXr] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/trial-quota/config | IP: 127.0.0.1
15:18:25.938 DEBUG [S2Qx5MXr] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:25.938 DEBUG [S2Qx5MXr] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:25.941 DEBUG [S2Qx5MXr] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:25.942 DEBUG [S2Qx5MXr] [1] [        main] c.x.u.m.T.insert               : ==>  Preparing: INSERT INTO t_trial_quota_config ( config_name, trial_days, daily_query_limit, monthly_watchlist_limit, enabled, config_type, applicable_user_type, current_users, priority, description, created_by, updated_by, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:25.942 DEBUG [S2Qx5MXr] [1] [        main] c.x.u.m.T.insert               : ==> Parameters: 待删除配置(String), 7(Integer), 10(Integer), 50(Integer), true(Boolean), COUPON(String), NEW_USER(String), 0(Integer), 99(Integer), 此配置将被删除(String), 1(Long), 1(Long), 2026-07-02T15:18:25.942390800(LocalDateTime), 2026-07-02T15:18:25.942390800(LocalDateTime)
15:18:25.948 DEBUG [S2Qx5MXr] [1] [        main] c.x.u.m.T.insert               : <==    Updates: 1
15:18:25.948  INFO [S2Qx5MXr] [1] [        main] .x.u.s.TrialQuotaConfigService : 创建体验配额配置: id=3, name=待删除配置
15:18:25.948 DEBUG [S2Qx5MXr] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:25.949 DEBUG [S2Qx5MXr] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580640090300417(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:25.948758600(LocalDateTime), TRIAL(String), CONFIG_CREATE(String), 创建体验配额配置(String), TRIAL_CONFIG(String), 3(Long), TRIAL_CONFIG:3(String), SUCCESS(String), true(Boolean), 2026-07-02T15:18:25.948758600(LocalDateTime)
15:18:25.954 DEBUG [S2Qx5MXr] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:25.954  WARN [S2Qx5MXr] [1] [        main] x.u.s.OperationAuditLogService : 【敏感操作】创建体验配额配置 - 操作人: 管理员(1), 目标: TRIAL_CONFIG:3, 结果: SUCCESS
15:18:25.954 DEBUG [S2Qx5MXr] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 创建体验配额配置
15:18:25.955 DEBUG [S2Qx5MXr] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/admin/trial-quota/config 200 17ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/admin/trial-quota/config
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA", Content-Length:"271"]
             Body = {
    "configName": "待删除配置",
    "trialDays": 7,
    "dailyQueryLimit": 10,
    "monthlyWatchlistLimit": 50,
    "enabled": true,
    "configType": "COUPON",
    "applicableUserType": "NEW_USER",
    "priority": 99,
    "description": "此配置将被删除"
}

    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
           Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#createConfig(TrialQuotaConfig, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"S2Qx5MXr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":3,"configName":"待删除配置","trialDays":7,"dailyQueryLimit":10,"monthlyWatchlistLimit":50,"enabled":true,"configType":"COUPON","applicableUserType":"NEW_USER","effectiveFrom":null,"effectiveTo":null,"maxUsers":null,"currentUsers":0,"priority":99,"description":"此配置将被删除","remark":null,"createdBy":1,"updatedBy":1,"createTime":"2026-07-02 15:18:25","updateTime":"2026-07-02 15:18:25"},"timestamp":1782976705954}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:25.958 DEBUG [24mTnQRn] [] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/admin/trial-quota/config/3 | IP: 127.0.0.1
15:18:25.959 DEBUG [24mTnQRn] [1] [        main] c.x.u.m.T.selectById           : ==>  Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config WHERE id=?
15:18:25.959 DEBUG [24mTnQRn] [1] [        main] c.x.u.m.T.selectById           : ==> Parameters: 3(Long)
15:18:25.960 DEBUG [24mTnQRn] [1] [        main] c.x.u.m.T.selectById           : <==      Total: 1
15:18:25.961 DEBUG [24mTnQRn] [1] [        main] c.x.u.m.T.deleteById           : ==>  Preparing: DELETE FROM t_trial_quota_config WHERE id=?
15:18:25.961 DEBUG [24mTnQRn] [1] [        main] c.x.u.m.T.deleteById           : ==> Parameters: 3(Long)
15:18:25.966 DEBUG [24mTnQRn] [1] [        main] c.x.u.m.T.deleteById           : <==    Updates: 1
15:18:25.966  INFO [24mTnQRn] [1] [        main] .x.u.s.TrialQuotaConfigService : 删除体验配额配置: id=3
15:18:25.967 DEBUG [24mTnQRn] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:25.967 DEBUG [24mTnQRn] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580640153214977(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:25.966552800(LocalDateTime), TRIAL(String), CONFIG_DELETE(String), 删除体验配额配置(String), TRIAL_CONFIG(String), 3(Long), TRIAL_CONFIG:3(String), SUCCESS(String), true(Boolean), 2026-07-02T15:18:25.967078100(LocalDateTime)
15:18:25.972 DEBUG [24mTnQRn] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:25.972  WARN [24mTnQRn] [1] [        main] x.u.s.OperationAuditLogService : 【敏感操作】删除体验配额配置 - 操作人: 管理员(1), 目标: TRIAL_CONFIG:3, 结果: SUCCESS
15:18:25.972 DEBUG [24mTnQRn] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 删除体验配额配置
15:18:25.973 DEBUG [24mTnQRn] [1] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/admin/trial-quota/config/3 200 15ms

MockHttpServletRequest:
      HTTP Method = DELETE
      Request URI = /api/admin/trial-quota/config/3
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
           Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#deleteConfig(Long, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"24mTnQRn", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976705972}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:25.978 DEBUG [Hf8fM7W8] [] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/admin/trial-quota/config/9999 | IP: 127.0.0.1
15:18:25.979 DEBUG [Hf8fM7W8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:25.979 DEBUG [Hf8fM7W8] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:25.981 DEBUG [Hf8fM7W8] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:25.982 DEBUG [Hf8fM7W8] [1] [        main] c.x.u.m.T.selectById           : ==>  Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config WHERE id=?
15:18:25.982 DEBUG [Hf8fM7W8] [1] [        main] c.x.u.m.T.selectById           : ==> Parameters: 9999(Long)
15:18:25.984 DEBUG [Hf8fM7W8] [1] [        main] c.x.u.m.T.selectById           : <==      Total: 0
15:18:25.984  WARN [Hf8fM7W8] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=404, message=体验配额配置不存在
15:18:25.985 DEBUG [Hf8fM7W8] [1] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/admin/trial-quota/config/9999 200 7ms

MockHttpServletRequest:
      HTTP Method = DELETE
      Request URI = /api/admin/trial-quota/config/9999
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
           Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#deleteConfig(Long, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Hf8fM7W8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":404,"message":"体验配额配置不存在","data":null,"timestamp":1782976705984}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:25.989 DEBUG [SXHR5LJV] [] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/admin/trial-quota/config/1 | IP: 127.0.0.1
15:18:25.991  WARN [SXHR5LJV] [] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/admin/trial-quota/config/1 401 2ms

MockHttpServletRequest:
      HTTP Method = DELETE
      Request URI = /api/admin/trial-quota/config/1
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"SXHR5LJV", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976705990}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:25.995 DEBUG [Yg7eMtMC] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/trial-quota/active | IP: 127.0.0.1
15:18:25.996 DEBUG [Yg7eMtMC] [] [        main] .m.T.selectActiveDefaultConfig : ==>  Preparing: SELECT * FROM t_trial_quota_config WHERE config_type = 'DEFAULT' AND enabled = true AND (effective_from IS NULL OR effective_from <= ?) AND (effective_to IS NULL OR effective_to >= ?) ORDER BY create_time DESC LIMIT 1
15:18:25.996 DEBUG [Yg7eMtMC] [] [        main] .m.T.selectActiveDefaultConfig : ==> Parameters: 2026-07-02T15:18:25.996190900(LocalDateTime), 2026-07-02T15:18:25.996190900(LocalDateTime)
15:18:25.998 DEBUG [Yg7eMtMC] [] [        main] .m.T.selectActiveDefaultConfig : <==      Total: 1
15:18:26.000 DEBUG [Yg7eMtMC] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/trial-quota/active 200 5ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/trial-quota/active
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.TrialQuotaConfigController
           Method = com.xuekairui.user.controller.TrialQuotaConfigController#getActiveConfig()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Yg7eMtMC", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":1,"configName":"测试体验配置（已更新）","trialDays":20,"dailyQueryLimit":40,"monthlyWatchlistLimit":300,"enabled":true,"configType":"DEFAULT","applicableUserType":"NEW_USER","effectiveFrom":null,"effectiveTo":null,"maxUsers":null,"currentUsers":0,"priority":2,"description":"更新后的配置","remark":null,"createdBy":1,"updatedBy":1,"createTime":"2026-07-02 15:18:26","updateTime":"2026-07-02 15:18:26"},"timestamp":1782976705998}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 13, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.561 s -- in 体验配额配置接口测试
[INFO] Running com.xuekairui.gateway.UserAuthFlowTest
15:18:26.003  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.UserAuthFlowTest]: UserAuthFlowTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:26.005  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.UserAuthFlowTest
15:18:28.973 DEBUG [r2cseZzj] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send | IP: 127.0.0.1
15:18:28.974  INFO [r2cseZzj] [] [        main] .x.u.s.VerificationCodeService : 【验证码-测试模式】是否启用 true
15:18:28.976  INFO [r2cseZzj] [] [        main] .x.u.s.VerificationCodeService : 【验证码-测试模式】手机号: 138****8000, 验证码: 123456 (固定), 场景: login, 有效期: 5分钟
15:18:28.976 DEBUG [r2cseZzj] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/send 200 3ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/send
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
             Body = {"phone":"13800138000","scene":"login"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"r2cseZzj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976708976}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:28.976  INFO [] [] [        main] c.x.gateway.UserAuthFlowTest   : ? 短信验证码发送成功: 13800138000
15:18:28.980 DEBUG [EQY2kT3x] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:18:28.983 DEBUG [EQY2kT3x] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:18:28.983 DEBUG [EQY2kT3x] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13811111111(String)
15:18:28.984 DEBUG [EQY2kT3x] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 0
15:18:28.985 DEBUG [EQY2kT3x] [] [        main] c.x.u.m.UserMapper.insert      : ==>  Preparing: INSERT INTO t_user ( id, phone, nickname, login_source, status, role, membership_level, token_version, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:28.985 DEBUG [EQY2kT3x] [] [        main] c.x.u.m.UserMapper.insert      : ==> Parameters: 2072580652799041537(Long), 13811111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 0(Long), 2026-07-02T15:18:28.985081800(LocalDateTime), 2026-07-02T15:18:28.985081800(LocalDateTime)
15:18:28.987 DEBUG [EQY2kT3x] [] [        main] c.x.u.m.UserMapper.insert      : <==    Updates: 1
15:18:28.987  INFO [EQY2kT3x] [] [        main] c.x.i.l.UserRegisteredListener : 收到用户注册事件: userId=2072580652799041537, inviteCode=null
15:18:28.987 DEBUG [EQY2kT3x] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
15:18:28.988 DEBUG [EQY2kT3x] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13811111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:28.987821900(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:18:28.985081800(LocalDateTime), 2026-07-02T15:18:28.985081800(LocalDateTime), 2072580652799041537(Long)
15:18:28.990 DEBUG [EQY2kT3x] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:28.991 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:28.991 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13811111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:28.987821900(LocalDateTime), 127.0.0.1(String), 1(Long), 0a6a111dbda23505146f843c81df8090eac8c472d0aa37e46affbb8ba2e2db26(String), ACTIVE(String), 2026-07-02T15:18:28.985081800(LocalDateTime), 2026-07-02T15:18:28.985081800(LocalDateTime), 2072580652799041537(Long)
15:18:28.994 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:28.994 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:28.994 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2072580652799041537(Long)
15:18:28.995 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:28.995 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:28.995 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580652799041537(Long)
15:18:28.997 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:28.998 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:28.998 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:28.999 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:29.000 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:29.000 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580652866150401(Long), 2072580652799041537(Long), 用户1111(String), USER(String), 2026-07-02T15:18:28.999856900(LocalDateTime), USER(String), REGISTER(String), 用户注册(String), USER(String), 2072580652799041537(Long), USER:2072580652799041537(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:28.999856900(LocalDateTime)
15:18:29.003 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:29.003 DEBUG [EQY2kT3x] [2072580652799041537] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户注册
15:18:29.003 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:29.003 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580652929064961(Long), 2072580652799041537(Long), 用户1111(String), USER(String), 2026-07-02T15:18:29.003118900(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 2072580652799041537(Long), USER:2072580652799041537(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:29.003652(LocalDateTime)
15:18:29.006 DEBUG [EQY2kT3x] [2072580652799041537] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:29.006 DEBUG [EQY2kT3x] [2072580652799041537] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:18:29.011 DEBUG [EQY2kT3x] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 31ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"57"]
             Body = {"phone":"13811111111","code":"123456","inviteCode":null}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"EQY2kT3x", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":2072580652799041537,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOCwiZXhwIjoxNzgzMDYzMTA4fQ.v7Rdq2D359acFHjosRrPudpfg8gdG3dQra_WCRKA0yLNwAg4Qqj4IOKsFRuWcPhj2SJZDGKuciAaGrh96jh_9w","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOCwiZXhwIjoxNzgzNTgxNTA4fQ.h9vxbDHAcQtyODFhcmnDTsxfrr1uoeFUnkklPBNpyOypFiEtSd2xQluwbpRkl-X0gQ8NAqC6C3wocVFkuL6Diw","expiresIn":86400,"userInfo":{"id":2072580652799041537,"phone":"138****1111","nickname":"用户1111","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:28","loginSource":"SMS","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":2072580652799041537,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":true,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976709009}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:29.011  INFO [] [] [        main] c.x.gateway.UserAuthFlowTest   : ? 新用户注册成功: userId=2072580652799041537, accessToken=eyJhbGciOiJIUzUxMiJ9...
15:18:29.022 DEBUG [7wrskVtR] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my | IP: 127.0.0.1
15:18:29.023 DEBUG [7wrskVtR] [2072580652799041537] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:29.024 DEBUG [7wrskVtR] [2072580652799041537] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580652799041537(Long)
15:18:29.025 DEBUG [7wrskVtR] [2072580652799041537] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:29.026 DEBUG [7wrskVtR] [2072580652799041537] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/my
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoidG1wMjA3MjU4MDY1Mjc5OTA0MTUzNyIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzMDYzMTA5fQ.dy3Ji-99C8mDamSJHXUzr5PekyLkUZHpot47BkmTvPmJKjE9BN3KUPWjnmdkq5Ca5c73-ZBxeYTKPCIDDf2MnQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"7wrskVtR", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":2072580652799041537,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976709025}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:29.027  INFO [] [] [        main] c.x.gateway.UserAuthFlowTest   : ? 用户2072580652799041537为普通会员(PLUS)，无过期时间，跳过校验
15:18:29.030 DEBUG [v3wjy6TE] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info | IP: 127.0.0.1
15:18:29.031 DEBUG [v3wjy6TE] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:29.031 DEBUG [v3wjy6TE] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2072580652799041537(Long)
15:18:29.033 DEBUG [v3wjy6TE] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:29.034 DEBUG [v3wjy6TE] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:29.034 DEBUG [v3wjy6TE] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2072580652799041537(Long)
15:18:29.036 DEBUG [v3wjy6TE] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:29.037 DEBUG [v3wjy6TE] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:29.037 DEBUG [v3wjy6TE] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2072580652799041537(Long)
15:18:29.038 DEBUG [v3wjy6TE] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:29.038 DEBUG [v3wjy6TE] [2072580652799041537] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:29.038 DEBUG [v3wjy6TE] [2072580652799041537] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580652799041537(Long)
15:18:29.040 DEBUG [v3wjy6TE] [2072580652799041537] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:29.041 DEBUG [v3wjy6TE] [2072580652799041537] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:29.041 DEBUG [v3wjy6TE] [2072580652799041537] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:29.042 DEBUG [v3wjy6TE] [2072580652799041537] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:29.043 DEBUG [v3wjy6TE] [2072580652799041537] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info 200 13ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/user/info
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOCwiZXhwIjoxNzgzMDYzMTA4fQ.v7Rdq2D359acFHjosRrPudpfg8gdG3dQra_WCRKA0yLNwAg4Qqj4IOKsFRuWcPhj2SJZDGKuciAaGrh96jh_9w"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#getUserInfo(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"v3wjy6TE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":2072580652799041537,"phone":"138****1111","nickname":"用户1111","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:29","loginSource":"SMS","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":2072580652799041537,"levelCode":"PLUS","version":null},"timestamp":1782976709042}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:29.043  INFO [] [] [        main] c.x.gateway.UserAuthFlowTest   : ? 获取用户信息成功
15:18:29.046 DEBUG [4PmQaxXq] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/refresh | IP: 127.0.0.1
15:18:29.051 DEBUG [4PmQaxXq] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,role,token_version,refresh_token_hash,refresh_token_status,status FROM t_user WHERE (id = ?)
15:18:29.051 DEBUG [4PmQaxXq] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 2072580652799041537(Long)
15:18:29.053 DEBUG [4PmQaxXq] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 1
15:18:29.054 DEBUG [4PmQaxXq] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, status=?, role=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, update_time=? WHERE id=?
15:18:29.054 DEBUG [4PmQaxXq] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13811111111(String), 1(Integer), USER(String), 1(Long), d17e2310b4458a0c4deca61b2ca4fba8ef855839d61947a962ec620c9acf2105(String), ACTIVE(String), 2026-07-02T15:18:29.054302500(LocalDateTime), 2072580652799041537(Long)
15:18:29.055 DEBUG [4PmQaxXq] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:29.055 DEBUG [4PmQaxXq] [] [        main] c.x.user.service.AuthService   : 用户 2072580652799041537 Refresh Token 旋转成功
15:18:29.057 DEBUG [4PmQaxXq] [] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:29.057 DEBUG [4PmQaxXq] [] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2072580652799041537(Long)
15:18:29.058 DEBUG [4PmQaxXq] [] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:29.058 DEBUG [4PmQaxXq] [] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:29.058 DEBUG [4PmQaxXq] [] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580652799041537(Long)
15:18:29.060 DEBUG [4PmQaxXq] [] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:29.060 DEBUG [4PmQaxXq] [] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:29.060 DEBUG [4PmQaxXq] [] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:29.061 DEBUG [4PmQaxXq] [] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:29.069 DEBUG [4PmQaxXq] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/refresh 200 23ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/refresh
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"273"]
             Body = {"refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOCwiZXhwIjoxNzgzNTgxNTA4fQ.h9vxbDHAcQtyODFhcmnDTsxfrr1uoeFUnkklPBNpyOypFiEtSd2xQluwbpRkl-X0gQ8NAqC6C3wocVFkuL6Diw"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#refreshToken(RefreshTokenRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"4PmQaxXq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":2072580652799041537,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzMDYzMTA5fQ.4RSruN_bqqKyuW_qQESH0VjgSxBiNipmzPGvCj9pSTVOSPPLdsdFyhj6PdyHGzH6Bq_oCnRlAH0XDKbCvd8RTQ","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzNTgxNTA5fQ.JlsjCap1plTXrGu24CeJOwMtEgqCdkVoanPFiWp3Y8Ung3G9KngDHTb0E7Hc92585-iMiTcIayeK2_rZR67r4A","expiresIn":86400,"userInfo":{"id":2072580652799041537,"phone":"138****1111","nickname":null,"avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":null,"loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":2072580652799041537,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":null,"kickedDeviceInfo":null},"timestamp":1782976709067}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:29.069  INFO [] [] [        main] c.x.gateway.UserAuthFlowTest   : ? Token刷新成功: eyJhbGciOiJIUzUxMiJ9...
15:18:29.071 DEBUG [MjCQ8sML] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:18:29.075 DEBUG [MjCQ8sML] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:18:29.075 DEBUG [MjCQ8sML] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13800138000(String)
15:18:29.077 DEBUG [MjCQ8sML] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 1
15:18:29.077 DEBUG [MjCQ8sML] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
15:18:29.077 DEBUG [MjCQ8sML] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:29.077377300(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:18:28(LocalDateTime), 2026-07-02T15:18:28(LocalDateTime), 1(Long)
15:18:29.080 DEBUG [MjCQ8sML] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:29.081 DEBUG [MjCQ8sML] [1] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:29.081 DEBUG [MjCQ8sML] [1] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:29.077377300(LocalDateTime), 127.0.0.1(String), 1(Long), 4505a47cd0b7d217f18677b6979a931878a44f585ed6f6f6e0f20b3d21beb495(String), ACTIVE(String), 2026-07-02T15:18:28(LocalDateTime), 2026-07-02T15:18:28(LocalDateTime), 1(Long)
15:18:29.084 DEBUG [MjCQ8sML] [1] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:29.084 DEBUG [MjCQ8sML] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:29.084 DEBUG [MjCQ8sML] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:29.086 DEBUG [MjCQ8sML] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:29.086 DEBUG [MjCQ8sML] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:29.086 DEBUG [MjCQ8sML] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:29.087 DEBUG [MjCQ8sML] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:29.088 DEBUG [MjCQ8sML] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:29.088 DEBUG [MjCQ8sML] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:29.089 DEBUG [MjCQ8sML] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:29.091 DEBUG [MjCQ8sML] [1] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:29.091 DEBUG [MjCQ8sML] [1] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580653252026369(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:29.090535(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:29.090535(LocalDateTime)
15:18:29.093 DEBUG [MjCQ8sML] [1] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:29.093 DEBUG [MjCQ8sML] [1] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:18:29.099 DEBUG [MjCQ8sML] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 28ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"57"]
             Body = {"phone":"13800138000","code":"123456","inviteCode":null}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"MjCQ8sML", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzMDYzMTA5fQ.9UWg603Q7O5F3vLqR5JD5aXPuZHi1GQz-R2BQ_4PldfA8i996hqzvHfqaPOt1ngiWynzRLuw-gehDY85JNzjWA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzNTgxNTA5fQ.LdHuIl8s135KBuw--e0Pclq9uVxiN4vmJnagvtpky-miHQ1H9KBF6vD7D1lgz0oxKTNroFdkUrVlHDsFtzniYg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:28","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976709098}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:29.099  INFO [] [] [        main] c.x.gateway.UserAuthFlowTest   : ? 老用户登录成功
15:18:29.102 DEBUG [SFy6sNEH] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/code | IP: 127.0.0.1
15:18:29.103 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:29.103 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2072580652799041537(Long)
15:18:29.105 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:29.106 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
15:18:29.106 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.i.m.I.selectList           : ==> Parameters: 2072580652799041537(Long), 1(Integer), 2026-07-02T15:18:29.106154400(LocalDateTime)
15:18:29.109 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.i.m.I.selectList           : <==      Total: 0
15:18:29.109 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:18:29.109 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:18:29.111 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:29.112 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.i.m.I.selectCount          : ==>  Preparing: SELECT COUNT( * ) AS total FROM t_invite_code WHERE (code = ?)
15:18:29.112 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.i.m.I.selectCount          : ==> Parameters: VE6YLXWM(String)
15:18:29.113 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.i.m.I.selectCount          : <==      Total: 1
15:18:29.114 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.i.m.I.insert               : ==>  Preparing: INSERT INTO t_invite_code ( user_id, code, max_uses, used_count, click_count, expire_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:29.114 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.i.m.I.insert               : ==> Parameters: 2072580652799041537(Long), VE6YLXWM(String), -1(Integer), 0(Integer), 0(Integer), 2026-08-01T15:18:29.111509200(LocalDateTime), 1(Integer), 2026-07-02T15:18:29.114170500(LocalDateTime), 2026-07-02T15:18:29.114170500(LocalDateTime)
15:18:29.119 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.i.m.I.insert               : <==    Updates: 1
15:18:29.120  INFO [SFy6sNEH] [2072580652799041537] [        main] c.x.i.service.InviteService    : 用户 2072580652799041537 创建邀请码: VE6YLXWM
15:18:29.120 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:18:29.120 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:18:29.122 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:29.122 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:29.122 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2072580652799041537(Long)
15:18:29.125 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:29.125 DEBUG [SFy6sNEH] [2072580652799041537] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/invite/code 200 23ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/invite/code
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOCwiZXhwIjoxNzgzMDYzMTA4fQ.v7Rdq2D359acFHjosRrPudpfg8gdG3dQra_WCRKA0yLNwAg4Qqj4IOKsFRuWcPhj2SJZDGKuciAaGrh96jh_9w"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.invite.controller.InviteController
           Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"SFy6sNEH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"code":"VE6YLXWM","inviteLink":"https://app.zhijiayun.com/api/invite/VE6YLXWM","inviterNickname":"用户1111","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:18:29","status":1,"createTime":"2026-07-02 15:18:29","shareTitle":"用户1111 邀请你加入智价云（药店版）","shareDescription":"登录智价云（药店版），邀请好友各得好礼","copyText":"我是用户1111，在这里发现了一个药店采购神器——智价云（药店版）！它聚合比价功能特别方便，能快速查到最低价，帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/VE6YLXWM填我的邀请码 VE6YLXWM 完成注册，你也会获得会员权益！","rewardDescription":"邀请人每成功邀请1家药店注册，赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/VE6YLXWM"},"timestamp":1782976709125}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:29.125  INFO [] [] [        main] c.x.gateway.UserAuthFlowTest   : ? 获取邀请码: VE6YLXWM
15:18:29.125 DEBUG [sBkXgBU4] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:18:29.129 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.selectList  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
15:18:29.129 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.selectList  : ==> Parameters: 13911111111(String)
15:18:29.130 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.selectList  : <==      Total: 0
15:18:29.130 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.insert      : ==>  Preparing: INSERT INTO t_user ( id, phone, nickname, login_source, status, role, membership_level, token_version, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:29.131 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.insert      : ==> Parameters: 2072580653440770050(Long), 13911111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 0(Long), 2026-07-02T15:18:29.130807300(LocalDateTime), 2026-07-02T15:18:29.130807300(LocalDateTime)
15:18:29.133 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.insert      : <==    Updates: 1
15:18:29.133  INFO [sBkXgBU4] [] [        main] c.x.i.l.UserRegisteredListener : 收到用户注册事件: userId=2072580653440770050, inviteCode=VE6YLXWM
15:18:29.134 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
15:18:29.134 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: VE6YLXWM(String)
15:18:29.136 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:29.136 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:29.136 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2072580653440770050(Long)
15:18:29.137 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:29.138 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.selectCount          : ==>  Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (invitee_id = ?)
15:18:29.138 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.selectCount          : ==> Parameters: 2072580653440770050(Long)
15:18:29.141 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.selectCount          : <==      Total: 1
15:18:29.141 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.selectList           : ==>  Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
15:18:29.141 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.selectList           : ==> Parameters: 
15:18:29.143 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.selectList           : <==      Total: 1
15:18:29.143 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.selectCount          : ==>  Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND registered = ?)
15:18:29.143 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.selectCount          : ==> Parameters: 2072580652799041537(Long), 1(Integer)
15:18:29.145 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.selectCount          : <==      Total: 1
15:18:29.145 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.insert               : ==>  Preparing: INSERT INTO t_invite_relation ( inviter_id, invitee_id, invite_code_id, registered, reward_granted, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )
15:18:29.145 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.insert               : ==> Parameters: 2072580652799041537(Long), 2072580653440770050(Long), 1(Long), 1(Integer), 1(Integer), 1(Integer), 2026-07-02T15:18:29.145939900(LocalDateTime), 2026-07-02T15:18:29.145939900(LocalDateTime)
15:18:29.148 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.insert               : <==    Updates: 1
15:18:29.149 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.updateById           : ==>  Preparing: UPDATE t_invite_code SET user_id=?, code=?, max_uses=?, used_count=?, click_count=?, expire_time=?, status=?, create_time=?, update_time=? WHERE id=?
15:18:29.150 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.updateById           : ==> Parameters: 2072580652799041537(Long), VE6YLXWM(String), -1(Integer), 1(Integer), 0(Integer), 2026-08-01T15:18:29(LocalDateTime), 1(Integer), 2026-07-02T15:18:29(LocalDateTime), 2026-07-02T15:18:29(LocalDateTime), 1(Long)
15:18:29.152 DEBUG [sBkXgBU4] [] [        main] c.x.i.m.I.updateById           : <==    Updates: 1
15:18:29.153 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:29.153 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2072580652799041537(Long)
15:18:29.155 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:29.155 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:29.155 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580652799041537(Long)
15:18:29.157 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:29.157 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.U.selectList           : ==>  Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
15:18:29.157 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.U.selectList           : ==> Parameters: 2072580652799041537(Long), 1(Integer)
15:18:29.160 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.U.selectList           : <==      Total: 0
15:18:29.160 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.U.insert               : ==>  Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, effective_to, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:29.160 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.U.insert               : ==> Parameters: 2072580653570793474(Long), 2072580652799041537(Long), PRO(String), INVITE(String), 2026-07-02T15:18:29.160374(LocalDateTime), 2026-08-01T15:18:29.160374(LocalDateTime), 1(Integer), 邀请奖励：邀请用户2072580653440770050注册(String), 2026-07-02T15:18:29.160374(LocalDateTime), 2026-07-02T15:18:29.160374(LocalDateTime)
15:18:29.163 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.U.insert               : <==    Updates: 1
15:18:29.163 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, membership_expire_at=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:29.163 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13811111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:18:29.160374(LocalDateTime), 2026-07-02T15:18:29(LocalDateTime), 127.0.0.1(String), 1(Long), d17e2310b4458a0c4deca61b2ca4fba8ef855839d61947a962ec620c9acf2105(String), ACTIVE(String), 2026-07-02T15:18:29(LocalDateTime), 2026-07-02T15:18:29(LocalDateTime), 2072580652799041537(Long)
15:18:29.166 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:29.166  INFO [sBkXgBU4] [] [        main] c.x.u.s.MembershipService      : 邀请奖励：用户2072580652799041537获得30天高级会员(PRO)
15:18:29.166  INFO [sBkXgBU4] [] [        main] c.x.i.service.InviteService    : 邀请奖励已发放: inviter=2072580652799041537, invitee=2072580653440770050, 会员=PRO/30天, 配额=0次
15:18:29.166  INFO [sBkXgBU4] [] [        main] c.x.i.service.InviteService    : 邀请成功: inviter=2072580652799041537, invitee=2072580653440770050
15:18:29.167 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, inviter_id=?, token_version=?, create_time=?, update_time=? WHERE id=?
15:18:29.167 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13911111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2072580652799041537(Long), 0(Long), 2026-07-02T15:18:29(LocalDateTime), 2026-07-02T15:18:29(LocalDateTime), 2072580653440770050(Long)
15:18:29.170 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:29.171 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
15:18:29.171 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13911111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:29.170580900(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:18:29.130807300(LocalDateTime), 2026-07-02T15:18:29.130807300(LocalDateTime), 2072580653440770050(Long)
15:18:29.174 DEBUG [sBkXgBU4] [] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:29.175 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.UserMapper.updateById  : ==>  Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
15:18:29.175 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.UserMapper.updateById  : ==> Parameters: 13911111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:29.170580900(LocalDateTime), 127.0.0.1(String), 1(Long), 4b2ad3dd8251e2b79bae4d3903c7291a17989359d61ab6d3f32cee43c4349458(String), ACTIVE(String), 2026-07-02T15:18:29.130807300(LocalDateTime), 2026-07-02T15:18:29.130807300(LocalDateTime), 2072580653440770050(Long)
15:18:29.178 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.UserMapper.updateById  : <==    Updates: 1
15:18:29.178 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:29.178 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 2072580653440770050(Long)
15:18:29.179 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:29.179 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:29.179 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580653440770050(Long)
15:18:29.181 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:29.181 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:29.182 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:29.183 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:29.184 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:29.184 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580653633708033(Long), 2072580653440770050(Long), 用户1111(String), USER(String), 2026-07-02T15:18:29.183950400(LocalDateTime), USER(String), REGISTER(String), 用户注册(String), USER(String), 2072580653440770050(Long), USER:2072580653440770050(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:29.183950400(LocalDateTime)
15:18:29.187 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:29.187 DEBUG [sBkXgBU4] [2072580653440770050] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户注册
15:18:29.187 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.O.insert               : ==>  Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:29.187 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.O.insert               : ==> Parameters: 2072580653696622594(Long), 2072580653440770050(Long), 用户1111(String), USER(String), 2026-07-02T15:18:29.187202(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 2072580653440770050(Long), USER:2072580653440770050(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:29.187202(LocalDateTime)
15:18:29.190 DEBUG [sBkXgBU4] [2072580653440770050] [        main] c.x.u.m.O.insert               : <==    Updates: 1
15:18:29.190 DEBUG [sBkXgBU4] [2072580653440770050] [        main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
15:18:29.194 DEBUG [sBkXgBU4] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 69ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"63"]
             Body = {"phone":"13911111111","code":"123456","inviteCode":"VE6YLXWM"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"sBkXgBU4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"userId":2072580653440770050,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1MzQ0MDc3MDA1MCwic3ViIjoiMjA3MjU4MDY1MzQ0MDc3MDA1MCIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzMDYzMTA5fQ.1U1wmM_7Z-Otb4-NXVT5VxCWB6uJv1wHVWveYkKDJ4YvICu-eEa73Asj9TK5C0I4sDBfqOksWA2MHnWJtmhBQw","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MjA3MjU4MDY1MzQ0MDc3MDA1MCwic3ViIjoiMjA3MjU4MDY1MzQ0MDc3MDA1MCIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzNTgxNTA5fQ.JwI0JCVikX9Wi3dy_ELGmONoJ5QP5VvOap8bjW0kIkWuvUXnZXqad4PfJtkTG7eJGWaXyUQrgf3xzih4VRBxaQ","expiresIn":86400,"userInfo":{"id":2072580653440770050,"phone":"139****1111","nickname":"用户1111","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员：每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:29","loginSource":"SMS","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":2072580653440770050,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":true,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976709194}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:29.195  INFO [] [] [        main] c.x.gateway.UserAuthFlowTest   : ? 带邀请码注册成功: inviteCode=VE6YLXWM
15:18:29.199 DEBUG [Ty3a5BKf] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my | IP: 127.0.0.1
15:18:29.199 DEBUG [Ty3a5BKf] [2072580653440770050] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:29.200 DEBUG [Ty3a5BKf] [2072580653440770050] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580653440770050(Long)
15:18:29.201 DEBUG [Ty3a5BKf] [2072580653440770050] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:29.202 DEBUG [Ty3a5BKf] [2072580653440770050] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/membership/my 200 3ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/membership/my
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoidG1wMjA3MjU4MDY1MzQ0MDc3MDA1MCIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1MzQ0MDc3MDA1MCwic3ViIjoiMjA3MjU4MDY1MzQ0MDc3MDA1MCIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzMDYzMTA5fQ.TaBQMhFVXqgnb3m2An40CCs_krqNd2bir7AjYeOdqOw-M7o_VvKIrPav9tqNnY2kJhTUfwfC-KcE4C5ZOjt8qQ"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.MembershipController
           Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"Ty3a5BKf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":2072580653440770050,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976709201}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:29.202  INFO [] [] [        main] c.x.gateway.UserAuthFlowTest   : ? 用户2072580653440770050为普通会员(PLUS)，无过期时间，跳过校验
15:18:29.205 DEBUG [ftMPk6pA] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/wechat/url | IP: 127.0.0.1
15:18:29.206 DEBUG [ftMPk6pA] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/wechat/url 200 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/wechat/url
       Parameters = {state=[login]}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#getWechatUrl(String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"ftMPk6pA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":"https://open.weixin.qq.com/connect/qrconnect?appid=test_app_id&redirect_uri=http://localhost/callback&response_type=code&scope=snsapi_login&state=login#wechat_redirect","timestamp":1782976709205}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:29.206  INFO [] [] [        main] c.x.gateway.UserAuthFlowTest   : ? 获取微信登录URL成功
15:18:29.208 DEBUG [7LT2PW8N] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login | IP: 127.0.0.1
15:18:29.215  WARN [7LT2PW8N] [] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=1102, message=验证码错误或已过期
15:18:29.216 DEBUG [7LT2PW8N] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/auth/sms/login 200 8ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/auth/sms/login
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"57"]
             Body = {"phone":"13800138000","code":"000000","inviteCode":null}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.AuthController
           Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"7LT2PW8N", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":1102,"message":"验证码错误或已过期","data":null,"timestamp":1782976709215}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:29.216  INFO [] [] [        main] c.x.gateway.UserAuthFlowTest   : ? 错误验证码处理正确
15:18:29.218 DEBUG [jSDRqb9v] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info | IP: 127.0.0.1
15:18:29.219  WARN [jSDRqb9v] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/user/info
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"jSDRqb9v", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976709219}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:29.219  INFO [] [] [        main] c.x.gateway.UserAuthFlowTest   : ? 未认证拦截正确
15:18:29.223 DEBUG [UYD8C5WD] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info | IP: 127.0.0.1
15:18:29.223  WARN [UYD8C5WD] [] [        main] c.xuekairui.user.util.JwtUtil  : JWT解析TokenLenient失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4.  Found: 0
15:18:29.223  WARN [UYD8C5WD] [] [        main] c.xuekairui.user.util.JwtUtil  : JWT解析TokenLenient失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4.  Found: 0
15:18:29.223  WARN [UYD8C5WD] [] [        main] .x.u.s.JwtAuthenticationFilter : JWT认证失败: Token无效
15:18:29.224  WARN [UYD8C5WD] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/auth/user/info 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/auth/user/info
       Parameters = {}
          Headers = [Authorization:"Bearer invalid_token_xyz"]
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"UYD8C5WD", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976709223}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:29.224  INFO [] [] [        main] c.x.gateway.UserAuthFlowTest   : ? 无效Token拦截正确
[INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.223 s -- in com.xuekairui.gateway.UserAuthFlowTest
[INFO] Running 关注/收藏接口测试
15:18:29.227  INFO [] [] [        main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.WatchlistControllerTest]: WatchlistControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:18:29.229  INFO [] [] [        main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.WatchlistControllerTest
15:18:32.184 DEBUG [VKRCxL95] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/watchlist | IP: 127.0.0.1
15:18:32.184 DEBUG [VKRCxL95] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:32.185 DEBUG [VKRCxL95] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:32.186 DEBUG [VKRCxL95] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:32.187 DEBUG [VKRCxL95] [1] [        main] c.x.u.m.W.selectList           : ==>  Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
15:18:32.187 DEBUG [VKRCxL95] [1] [        main] c.x.u.m.W.selectList           : ==> Parameters: 1(Long), 1(Integer)
15:18:32.189 DEBUG [VKRCxL95] [1] [        main] c.x.u.m.W.selectList           : <==      Total: 0
15:18:32.190 DEBUG [VKRCxL95] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/watchlist 200 6ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/watchlist
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.WatchlistController
           Method = com.xuekairui.user.controller.WatchlistController#list(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"VKRCxL95", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976712189}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:32.192 DEBUG [hW43SNQL] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/watchlist | IP: 127.0.0.1
15:18:32.193  WARN [hW43SNQL] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/watchlist 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/watchlist
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"hW43SNQL", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976712193}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:32.198 DEBUG [d7DeawZf] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/watchlist | IP: 127.0.0.1
15:18:32.198 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:32.198 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:32.199 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:32.203 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.W.countMonthlyByUserId : ==>  Preparing: SELECT COUNT(*) FROM t_watchlist WHERE user_id = ? AND status = 1 AND YEAR(create_time) = YEAR(CURDATE()) AND MONTH(create_time) = MONTH(CURDATE())
15:18:32.203 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.W.countMonthlyByUserId : ==> Parameters: 1(Long)
15:18:32.204 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.W.countMonthlyByUserId : <==      Total: 1
15:18:32.204 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:32.204 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:32.206 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:32.206 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:32.206 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:32.208 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:32.208 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:32.208 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:32.210 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:32.211 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.W.selectList           : ==>  Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE (user_id = ? AND drug_name = ? AND spec = ? AND status = ?)
15:18:32.211 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.W.selectList           : ==> Parameters: 1(Long), 阿莫西林胶囊(String), 0.5g*24粒/盒(String), 1(Integer)
15:18:32.212 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.W.selectList           : <==      Total: 0
15:18:32.213 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.W.insert               : ==>  Preparing: INSERT INTO t_watchlist ( id, user_id, drug_name, spec, manufacturer, min_price, min_price_platform, last_price, price_change, last_check_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:32.214 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.W.insert               : ==> Parameters: 2072580666346643457(Long), 1(Long), 阿莫西林胶囊(String), 0.5g*24粒/盒(String), 华北制药(String), 11.80(BigDecimal), yaobangmang(String), 11.80(BigDecimal), 0(BigDecimal), 2026-07-02T15:18:32.212956300(LocalDateTime), 1(Integer), 2026-07-02T15:18:32.213484400(LocalDateTime), 2026-07-02T15:18:32.213484400(LocalDateTime)
15:18:32.216 DEBUG [d7DeawZf] [1] [        main] c.x.u.m.W.insert               : <==    Updates: 1
15:18:32.221 DEBUG [d7DeawZf] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/watchlist 200 23ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/watchlist
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA", Content-Length:"137"]
             Body = {"drugName":"阿莫西林胶囊","spec":"0.5g*24粒/盒","manufacturer":"华北制药","minPrice":11.80,"minPricePlatform":"yaobangmang"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.WatchlistController
           Method = com.xuekairui.user.controller.WatchlistController#add(HttpServletRequest, WatchlistAddRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"d7DeawZf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":2072580666346643457,"drugName":"阿莫西林胶囊","spec":"0.5g*24粒/盒","manufacturer":"华北制药","minPrice":11.80,"minPricePlatform":"yaobangmang","lastPrice":11.80,"priceChange":0,"lastCheckTime":"2026-07-02 15:18:32","createTime":"2026-07-02 15:18:32"},"timestamp":1782976712220}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:32.225 DEBUG [5R5TApsf] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/watchlist | IP: 127.0.0.1
15:18:32.226 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:32.226 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:32.227 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:32.229 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.W.countMonthlyByUserId : ==>  Preparing: SELECT COUNT(*) FROM t_watchlist WHERE user_id = ? AND status = 1 AND YEAR(create_time) = YEAR(CURDATE()) AND MONTH(create_time) = MONTH(CURDATE())
15:18:32.229 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.W.countMonthlyByUserId : ==> Parameters: 1(Long)
15:18:32.230 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.W.countMonthlyByUserId : <==      Total: 1
15:18:32.230 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:32.230 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:32.231 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:32.231 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:32.231 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:32.233 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:32.233 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:32.233 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:32.235 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:32.235 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.W.selectList           : ==>  Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE (user_id = ? AND drug_name = ? AND spec = ? AND status = ?)
15:18:32.235 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.W.selectList           : ==> Parameters: 1(Long), 阿莫西林胶囊(String), 0.5g*24粒/盒(String), 1(Integer)
15:18:32.237 DEBUG [5R5TApsf] [1] [        main] c.x.u.m.W.selectList           : <==      Total: 1
15:18:32.240  WARN [5R5TApsf] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=4402, message=该药品已在关注列表中
15:18:32.240 DEBUG [5R5TApsf] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/watchlist 200 15ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/watchlist
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA", Content-Length:"87"]
             Body = {"drugName":"阿莫西林胶囊","spec":"0.5g*24粒/盒","manufacturer":"华北制药"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.WatchlistController
           Method = com.xuekairui.user.controller.WatchlistController#add(HttpServletRequest, WatchlistAddRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"5R5TApsf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":4402,"message":"该药品已在关注列表中","data":null,"timestamp":1782976712240}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:32.244 DEBUG [9UmQbxk6] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/watchlist | IP: 127.0.0.1
15:18:32.245 DEBUG [9UmQbxk6] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:32.245 DEBUG [9UmQbxk6] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:32.248 DEBUG [9UmQbxk6] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:32.249  WARN [9UmQbxk6] [1] [        main] c.x.h.GlobalExceptionHandler   : 参数校验失败: 药品名称不能为空
15:18:32.250  WARN [9UmQbxk6] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/watchlist 400 6ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/watchlist
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA", Content-Length:"29"]
             Body = {"drugName":"","spec":"test"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.WatchlistController
           Method = com.xuekairui.user.controller.WatchlistController#add(HttpServletRequest, WatchlistAddRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MethodArgumentNotValidException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [X-Request-Id:"9UmQbxk6", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":400,"message":"药品名称不能为空","data":null,"timestamp":1782976712249}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:32.252 DEBUG [B2wBRx6C] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/watchlist | IP: 127.0.0.1
15:18:32.252  WARN [B2wBRx6C] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/watchlist 401 0ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/watchlist
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"19"]
             Body = {"drugName":"test"}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"B2wBRx6C", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976712252}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:32.258 DEBUG [KXegqxHK] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/watchlist | IP: 127.0.0.1
15:18:32.258 DEBUG [KXegqxHK] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:32.258 DEBUG [KXegqxHK] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:32.259 DEBUG [KXegqxHK] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:32.260 DEBUG [KXegqxHK] [1] [        main] c.x.u.m.W.selectList           : ==>  Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
15:18:32.260 DEBUG [KXegqxHK] [1] [        main] c.x.u.m.W.selectList           : ==> Parameters: 1(Long), 1(Integer)
15:18:32.261 DEBUG [KXegqxHK] [1] [        main] c.x.u.m.W.selectList           : <==      Total: 1
15:18:32.262 DEBUG [KXegqxHK] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/watchlist 200 4ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/watchlist
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.WatchlistController
           Method = com.xuekairui.user.controller.WatchlistController#list(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"KXegqxHK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":[{"id":2072580666346643457,"drugName":"阿莫西林胶囊","spec":"0.5g*24粒/盒","manufacturer":"华北制药","minPrice":11.80,"minPricePlatform":"yaobangmang","lastPrice":11.80,"priceChange":0.00,"lastCheckTime":"2026-07-02 15:18:32","createTime":"2026-07-02 15:18:32"}],"timestamp":1782976712261}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:32.266 DEBUG [gSJPewXD] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/watchlist/stats | IP: 127.0.0.1
15:18:32.267 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:32.267 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:32.268 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:32.269 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.W.countByUserId        : ==>  Preparing: SELECT COUNT(*) FROM t_watchlist WHERE user_id = ? AND status = 1
15:18:32.269 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.W.countByUserId        : ==> Parameters: 1(Long)
15:18:32.270 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.W.countByUserId        : <==      Total: 1
15:18:32.270 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.W.countMonthlyByUserId : ==>  Preparing: SELECT COUNT(*) FROM t_watchlist WHERE user_id = ? AND status = 1 AND YEAR(create_time) = YEAR(CURDATE()) AND MONTH(create_time) = MONTH(CURDATE())
15:18:32.270 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.W.countMonthlyByUserId : ==> Parameters: 1(Long)
15:18:32.271 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.W.countMonthlyByUserId : <==      Total: 1
15:18:32.271 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:32.271 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:32.272 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:32.272 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:32.272 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:32.273 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:32.274 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:32.274 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:32.275 DEBUG [gSJPewXD] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:32.276 DEBUG [gSJPewXD] [1] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/watchlist/stats 200 10ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/watchlist/stats
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.WatchlistController
           Method = com.xuekairui.user.controller.WatchlistController#stats(HttpServletRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"gSJPewXD", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"monthlyUsed":1,"total":1,"monthlyLimit":50},"timestamp":1782976712275}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:32.279 DEBUG [QqPaRy56] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/watchlist/stats | IP: 127.0.0.1
15:18:32.280  WARN [QqPaRy56] [] [        main] c.x.g.f.RequestLoggingFilter   : GET /api/watchlist/stats 401 1ms

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/watchlist/stats
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [X-Request-Id:"QqPaRy56", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"code":401,"message":"未授权，请先登录","data":null,"timestamp":1782976712279}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:32.284 DEBUG [nFAP7s3K] [] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/watchlist/999999 | IP: 127.0.0.1
15:18:32.285 DEBUG [nFAP7s3K] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:32.285 DEBUG [nFAP7s3K] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:32.286 DEBUG [nFAP7s3K] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:32.287 DEBUG [nFAP7s3K] [1] [        main] c.x.u.m.W.selectById           : ==>  Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE id=?
15:18:32.287 DEBUG [nFAP7s3K] [1] [        main] c.x.u.m.W.selectById           : ==> Parameters: 999999(Long)
15:18:32.288 DEBUG [nFAP7s3K] [1] [        main] c.x.u.m.W.selectById           : <==      Total: 0
15:18:32.290  WARN [nFAP7s3K] [1] [        main] c.x.h.GlobalExceptionHandler   : 业务异常: code=4403, message=关注记录不存在
15:18:32.291 DEBUG [nFAP7s3K] [1] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/watchlist/999999 200 7ms

MockHttpServletRequest:
      HTTP Method = DELETE
      Request URI = /api/watchlist/999999
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.WatchlistController
           Method = com.xuekairui.user.controller.WatchlistController#remove(HttpServletRequest, Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = com.xuekairui.common.BusinessException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"nFAP7s3K", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":4403,"message":"关注记录不存在","data":null,"timestamp":1782976712290}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:32.295 DEBUG [d53S9AmD] [] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/watchlist | IP: 127.0.0.1
15:18:32.295 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:32.295 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:32.297 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:32.301 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.W.countMonthlyByUserId : ==>  Preparing: SELECT COUNT(*) FROM t_watchlist WHERE user_id = ? AND status = 1 AND YEAR(create_time) = YEAR(CURDATE()) AND MONTH(create_time) = MONTH(CURDATE())
15:18:32.301 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.W.countMonthlyByUserId : ==> Parameters: 1(Long)
15:18:32.302 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.W.countMonthlyByUserId : <==      Total: 1
15:18:32.302 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.UserMapper.selectById  : ==>  Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
15:18:32.302 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.UserMapper.selectById  : ==> Parameters: 1(Long)
15:18:32.304 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.UserMapper.selectById  : <==      Total: 1
15:18:32.304 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==>  Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
15:18:32.304 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
15:18:32.305 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.U.selectActiveByUserId : <==      Total: 0
15:18:32.305 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.M.selectList           : ==>  Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
15:18:32.305 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.M.selectList           : ==> Parameters: PLUS(String), 1(Integer)
15:18:32.306 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.M.selectList           : <==      Total: 3
15:18:32.307 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.W.selectList           : ==>  Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE (user_id = ? AND drug_name = ? AND spec = ? AND status = ?)
15:18:32.307 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.W.selectList           : ==> Parameters: 1(Long), 布洛芬缓释胶囊(String), 0.3g*20粒/盒(String), 1(Integer)
15:18:32.308 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.W.selectList           : <==      Total: 0
15:18:32.308 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.W.insert               : ==>  Preparing: INSERT INTO t_watchlist ( id, user_id, drug_name, spec, manufacturer, price_change, last_check_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
15:18:32.308 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.W.insert               : ==> Parameters: 2072580666791239681(Long), 1(Long), 布洛芬缓释胶囊(String), 0.3g*20粒/盒(String), 中美史克(String), 0(BigDecimal), 2026-07-02T15:18:32.308302400(LocalDateTime), 1(Integer), 2026-07-02T15:18:32.308827700(LocalDateTime), 2026-07-02T15:18:32.308827700(LocalDateTime)
15:18:32.310 DEBUG [d53S9AmD] [1] [        main] c.x.u.m.W.insert               : <==    Updates: 1
15:18:32.314 DEBUG [d53S9AmD] [1] [        main] c.x.g.f.RequestLoggingFilter   : POST /api/watchlist 200 19ms

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/watchlist
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA", Content-Length:"90"]
             Body = {"drugName":"布洛芬缓释胶囊","spec":"0.3g*20粒/盒","manufacturer":"中美史克"}
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.WatchlistController
           Method = com.xuekairui.user.controller.WatchlistController#add(HttpServletRequest, WatchlistAddRequest)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"d53S9AmD", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":{"id":2072580666791239681,"drugName":"布洛芬缓释胶囊","spec":"0.3g*20粒/盒","manufacturer":"中美史克","minPrice":null,"minPricePlatform":null,"lastPrice":null,"priceChange":0,"lastCheckTime":"2026-07-02 15:18:32","createTime":"2026-07-02 15:18:32"},"timestamp":1782976712314}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
15:18:32.315 DEBUG [tGkcJwbP] [] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/watchlist/2072580666791239681 | IP: 127.0.0.1
15:18:32.317 DEBUG [tGkcJwbP] [1] [        main] c.x.u.m.W.selectById           : ==>  Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE id=?
15:18:32.317 DEBUG [tGkcJwbP] [1] [        main] c.x.u.m.W.selectById           : ==> Parameters: 2072580666791239681(Long)
15:18:32.318 DEBUG [tGkcJwbP] [1] [        main] c.x.u.m.W.selectById           : <==      Total: 1
15:18:32.319 DEBUG [tGkcJwbP] [1] [        main] c.x.u.m.W.updateById           : ==>  Preparing: UPDATE t_watchlist SET user_id=?, drug_name=?, spec=?, manufacturer=?, price_change=?, last_check_time=?, status=?, create_time=?, update_time=? WHERE id=?
15:18:32.319 DEBUG [tGkcJwbP] [1] [        main] c.x.u.m.W.updateById           : ==> Parameters: 1(Long), 布洛芬缓释胶囊(String), 0.3g*20粒/盒(String), 中美史克(String), 0.00(BigDecimal), 2026-07-02T15:18:32(LocalDateTime), 0(Integer), 2026-07-02T15:18:32(LocalDateTime), 2026-07-02T15:18:32(LocalDateTime), 2072580666791239681(Long)
15:18:32.322 DEBUG [tGkcJwbP] [1] [        main] c.x.u.m.W.updateById           : <==    Updates: 1
15:18:32.326 DEBUG [tGkcJwbP] [1] [        main] c.x.g.f.RequestLoggingFilter   : DELETE /api/watchlist/2072580666791239681 200 11ms

MockHttpServletRequest:
      HTTP Method = DELETE
      Request URI = /api/watchlist/2072580666791239681
       Parameters = {}
          Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA"]
             Body = null
    Session Attrs = {}

Handler:
             Type = com.xuekairui.user.controller.WatchlistController
           Method = com.xuekairui.user.controller.WatchlistController#remove(HttpServletRequest, Long)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [X-Request-Id:"tGkcJwbP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976712325}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
[INFO] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.101 s -- in 关注/收藏接口测试
[INFO] 
[INFO] Results:
[INFO] 
[ERROR] Failures: 
[ERROR]   AuthControllerTest.getUserInfo_withExpiredToken_shouldReturn401:222 Status expected:<401> but was:<200>
[ERROR]   EndToEndBusinessFlowTest.stage7_AdminReviewLicense:264 Status expected:<200> but was:<401>
[ERROR]   EndToEndBusinessFlowTest.stage8_CheckAuditLogs:295 Status expected:<200> but was:<401>
[INFO] 
[ERROR] Tests run: 381, Failures: 3, Errors: 0, Skipped: 0
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] zhijiayun-pharmacy 1.0-SNAPSHOT .................... SUCCESS [  0.140 s]
[INFO] zhijiayun-common 1.0.0 ............................. SUCCESS [  2.195 s]
[INFO] zhijiayun-user 1.0.0 ............................... SUCCESS [  5.212 s]
[INFO] zhijiayun-payment 1.0.0 ............................ SUCCESS [  2.564 s]
[INFO] zhijiayun-invite 1.0.0 ............................. SUCCESS [  1.449 s]
[INFO] zhijiayun-gateway 1.0.0 ............................ FAILURE [01:35 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:47 min
[INFO] Finished at: 2026-07-02T15:18:32+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.5.5:test (default-test) on project zhijiayun-gateway: There are test failures.
[ERROR] 
[ERROR] See D:\project\zhijiayun-pharmacy\zhijiayun-gateway\target\surefire-reports for the individual test results.
[ERROR] See dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR] 
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <args> -rf :zhijiayun-gateway
