but was:<400> at com.etotem.cfc.controller.mind.MindFortuneControllerTest.testGetTodayFortuneWithoutAuth(MindFortuneControllerTest.java:23) ]]> Preparing: SELECT id,flow_id,flow_version,family_id,family_member_id,trigger_source,status,started_at,finished_at,error_reason,created_at,updated_at FROM task_orchestration_executions WHERE (status = ?) LIMIT 20 2026-11-06 02:18:29.761 DEBUG 17028 --- [eduler_Worker-5] c.e.c.m.T.selectList : ==> Parameters: running(String) 2026-11-06 02:18:29.762 DEBUG 17028 --- [eduler_Worker-5] c.e.c.m.T.selectList : <== Total: 0 2026-11-06 02:18:29.762 INFO 17028 --- [eduler_Worker-5] c.e.cfc.task.OrchestrationPollingJob : 编排轮询结束 2026-11-06 02:18:29.802 INFO 17028 --- [ main] .b.t.c.SpringBootTestContextBootstrapper : Found @SpringBootConfiguration com.etotem.cfc.CfcApplication for test class com.etotem.cfc.controller.mind.MindFortuneControllerTest 2026-11-06 02:18:29.805 INFO 17028 --- [ main] .b.t.c.SpringBootTestContextBootstrapper : Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener, org.springframework.boot.test.autoconfigure.webservices.client.MockWebServiceServerTestExecutionListener, org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.event.ApplicationEventsTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener, org.springframework.test.context.event.EventPublishingTestExecutionListener] 2026-11-06 02:18:29.807 INFO 17028 --- [ main] .b.t.c.SpringBootTestContextBootstrapper : Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@7a91bbdb, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@1ffd4518, org.springframework.test.context.event.ApplicationEventsTestExecutionListener@bf7e3a, org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@4af85036, org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@3d4065d1, org.springframework.test.context.support.DirtiesContextTestExecutionListener@486032e4, org.springframework.test.context.transaction.TransactionalTestExecutionListener@33d5cb7c, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@3ba454d0, org.springframework.test.context.event.EventPublishingTestExecutionListener@5f4d098, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener@4cca35d0, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener@51d9891e, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener@48c25521, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener@6b113cb1, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener@76e8f0b6, org.springframework.boot.test.autoconfigure.webservices.client.MockWebServiceServerTestExecutionListener@6be4160c] 2026-11-06 02:18:29.820 DEBUG 17028 --- [ main] com.etotem.cfc.config.JwtInterceptor : 请求 /api/mind/fortune 无Token,设为匿名用户 2026-11-06 02:18:31.135 DEBUG 17028 --- [cfc-scheduler-1] c.e.c.m.H.listPendingRetry : ==> Preparing: SELECT * FROM health_report_drafts WHERE status = 'pending' AND parse_status = 'collecting' AND ((next_retry_at IS NOT NULL AND next_retry_at <= ?) OR (next_retry_at IS NULL AND (parse_started_at IS NULL OR parse_started_at < DATE_SUB(?, INTERVAL 30 MINUTE)))) ORDER BY updated_at ASC LIMIT ? 2026-11-06 02:18:31.135 DEBUG 17028 --- [cfc-scheduler-1] c.e.c.m.H.listPendingRetry : ==> Parameters: 2026-11-06 02:18:31.129(Timestamp), 2026-11-06 02:18:31.129(Timestamp), 20(Integer) 2026-11-06 02:18:31.139 DEBUG 17028 --- [cfc-scheduler-4] c.e.c.m.ProductOrderMapper.selectList : ==> Preparing: SELECT id,order_no,product_id,product_name,product_type,sku_id,buyer_id,family_id,quantity,unit_price,total_amount,status,payment_method,remark,discount_amount,coupon_id,cancel_at,transaction_id,cover_image,address_snapshot,logistics_no,logistics_company,tracking_number,express_company,delivery_method,pickup_code,confirm_time,paid_at,refund_status,refund_reason,refund_amount,refund_time,supply_system_id,supplier_id,supply_commission,points_used,points_cost,money_amount,consignee_id,purchase_info,activity_id,provision_status,auditor_id,audited_at,audit_reason,shipping_cost,gift_amount,pickup_location_id,pickup_location_snapshot,time_slot_id,time_slot_snapshot,service_person_id,service_person_snapshot,fulfill_status,fulfill_confirmed_at,received_at,created_at,updated_at,special_deal_id FROM product_orders WHERE (status = ? AND created_at < ?) 2026-11-06 02:18:31.139 DEBUG 17028 --- [cfc-scheduler-4] c.e.c.m.ProductOrderMapper.selectList : ==> Parameters: pending(String), 2026-11-06 01:48:31.138(Timestamp) 2026-11-06 02:18:31.141 DEBUG 17028 --- [cfc-scheduler-4] c.e.c.m.ProductOrderMapper.selectList : <== Total: 0 2026-11-06 02:18:31.141 DEBUG 17028 --- [cfc-scheduler-2] c.e.c.m.A.selectList : ==> Preparing: SELECT id,order_no,family_id,user_id,child_id AS memberId,guide_id,package_id,guide_name,package_name,total_price,discount_amount,actual_price,appointment_id,status,pay_time,pay_type,transaction_id,created_at,updated_at FROM assessment_orders WHERE (status = ? AND created_at < ?) 2026-11-06 02:18:31.142 DEBUG 17028 --- [cfc-scheduler-2] c.e.c.m.A.selectList : ==> Parameters: pending(String), 2026-11-06 01:48:31.129(Timestamp) 2026-11-06 02:18:31.142 DEBUG 17028 --- [cfc-scheduler-1] c.e.c.m.H.listPendingRetry : <== Total: 0 2026-11-06 02:18:31.145 DEBUG 17028 --- [cfc-scheduler-2] c.e.c.m.A.selectList : <== Total: 0 2026-11-06 02:18:31.146 DEBUG 17028 --- [cfc-scheduler-2] c.e.c.m.PaymentOrderMapper.selectList : ==> Preparing: SELECT id,order_no,family_id,level_code,payment_type,period,amount,user_coupon_id,status,group_no,period_no,pay_method,transaction_id,paid_at,created_at,updated_at FROM payment_orders WHERE (status = ? AND created_at < ?) 2026-11-06 02:18:31.146 DEBUG 17028 --- [cfc-scheduler-2] c.e.c.m.PaymentOrderMapper.selectList : ==> Parameters: pending(String), 2026-11-06 01:48:31.129(Timestamp) 2026-11-06 02:18:31.147 DEBUG 17028 --- [cfc-scheduler-2] c.e.c.m.PaymentOrderMapper.selectList : <== Total: 0 2026-11-06 02:18:31.149 DEBUG 17028 --- [cfc-scheduler-2] c.e.c.m.M.selectList : ==> Preparing: SELECT id,family_id,level,amount,status,payment_type,transaction_id,order_no,created_at,paid_at FROM member_subscription_order WHERE (status = ? AND created_at < ?) 2026-11-06 02:18:31.149 DEBUG 17028 --- [cfc-scheduler-2] c.e.c.m.M.selectList : ==> Parameters: pending(String), 2026-11-06 01:48:31.129(Timestamp) 2026-11-06 02:18:31.150 DEBUG 17028 --- [cfc-scheduler-2] c.e.c.m.M.selectList : <== Total: 0 2026-11-06 02:18:31.150 INFO 17028 --- [cfc-scheduler-2] c.etotem.cfc.task.VirtualPayTimeoutTask : 虚拟支付超时兜底扫描完成: 测评=0/0, 会员=0/0, 订阅=0/0 2026-11-06 02:18:31.893 WARN 17028 --- [ main] c.e.cfc.config.RateLimitInterceptor : Redis 限流不可用,降级到内存限流: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhost:6379 2026-11-06 02:18:31.894 DEBUG 17028 --- [ main] c.e.cfc.mapper.UserMapper.selectById : ==> Preparing: SELECT id,openid,unionid,family_id,role,roles,nickname,avatar,password,id_card,real_name,phone,session_key,birthday,birth_hour,gender,total_points,teacher_family_ids,teacher_no,teacher_photo,certificate_image,teacher_status,teacher_reject_reason,address,province,city,district,street,ethnicity,blood_type,highest_education,marital_status,hobbies,diet_preferences,family_role,vendor_type,vendor_status,vendor_reject_reason,show_to_family,mascot,portrait_prompt,is_family_admin,is_child,vendor_info,referrer_id,family_inviter_id,referral_code,member_level,member_expire_time,total_consumption,upgrade_from_consumption,direct_count,indirect_count,total_commission_earned,butler_status,butler_info,butler_approved_at,nutritionist_status,nutritionist_reject_reason,article_admin_status,activity_provider_status,created_at,updated_at,deleted FROM users WHERE id=? AND deleted=0 2026-11-06 02:18:31.894 DEBUG 17028 --- [ main] c.e.cfc.mapper.UserMapper.selectById : ==> Parameters: -1(Long) 2026-11-06 02:18:31.896 DEBUG 17028 --- [ main] c.e.cfc.mapper.UserMapper.selectById : <== Total: 0 2026-11-06 02:18:31.906 DEBUG 17028 --- [ main] c.e.cfc.mapper.UserMapper.selectById : ==> Preparing: SELECT id,openid,unionid,family_id,role,roles,nickname,avatar,password,id_card,real_name,phone,session_key,birthday,birth_hour,gender,total_points,teacher_family_ids,teacher_no,teacher_photo,certificate_image,teacher_status,teacher_reject_reason,address,province,city,district,street,ethnicity,blood_type,highest_education,marital_status,hobbies,diet_preferences,family_role,vendor_type,vendor_status,vendor_reject_reason,show_to_family,mascot,portrait_prompt,is_family_admin,is_child,vendor_info,referrer_id,family_inviter_id,referral_code,member_level,member_expire_time,total_consumption,upgrade_from_consumption,direct_count,indirect_count,total_commission_earned,butler_status,butler_info,butler_approved_at,nutritionist_status,nutritionist_reject_reason,article_admin_status,activity_provider_status,created_at,updated_at,deleted FROM users WHERE id=? AND deleted=0 2026-11-06 02:18:31.907 DEBUG 17028 --- [ main] c.e.cfc.mapper.UserMapper.selectById : ==> Parameters: -1(Long) 2026-11-06 02:18:31.908 DEBUG 17028 --- [ main] c.e.cfc.mapper.UserMapper.selectById : <== Total: 0 2026-11-06 02:18:31.913 DEBUG 17028 --- [ main] c.e.cfc.mapper.UserMapper.selectById : ==> Preparing: SELECT id,openid,unionid,family_id,role,roles,nickname,avatar,password,id_card,real_name,phone,session_key,birthday,birth_hour,gender,total_points,teacher_family_ids,teacher_no,teacher_photo,certificate_image,teacher_status,teacher_reject_reason,address,province,city,district,street,ethnicity,blood_type,highest_education,marital_status,hobbies,diet_preferences,family_role,vendor_type,vendor_status,vendor_reject_reason,show_to_family,mascot,portrait_prompt,is_family_admin,is_child,vendor_info,referrer_id,family_inviter_id,referral_code,member_level,member_expire_time,total_consumption,upgrade_from_consumption,direct_count,indirect_count,total_commission_earned,butler_status,butler_info,butler_approved_at,nutritionist_status,nutritionist_reject_reason,article_admin_status,activity_provider_status,created_at,updated_at,deleted FROM users WHERE id=? AND deleted=0 2026-11-06 02:18:31.913 DEBUG 17028 --- [ main] c.e.cfc.mapper.UserMapper.selectById : ==> Parameters: -1(Long) 2026-11-06 02:18:31.914 DEBUG 17028 --- [ main] c.e.cfc.mapper.UserMapper.selectById : <== Total: 0 2026-11-06 02:18:31.915 DEBUG 17028 --- [ main] c.e.c.m.UserOperationLogMapper.insert : ==> Preparing: INSERT INTO user_operation_logs ( user_id, operation_type, description, request_path, request_method, response_status, client_ip, created_at ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) 2026-11-06 02:18:31.916 DEBUG 17028 --- [ main] c.e.c.m.UserOperationLogMapper.insert : ==> Parameters: -1(Long), post(String), POST /api/mind/fortune(String), /api/mind/fortune(String), POST(String), 200(Integer), 127.0.0.1(String), 2026-11-06 02:18:31.913(Timestamp) 2026-11-06 02:18:31.918 DEBUG 17028 --- [ main] c.e.c.m.UserOperationLogMapper.insert : <== Updates: 1 MockHttpServletRequest: HTTP Method = POST Request URI = /api/mind/fortune Parameters = {} Headers = [] Body = null Session Attrs = {} Handler: Type = com.etotem.cfc.controller.mind.MindFortuneController Method = com.etotem.cfc.controller.mind.MindFortuneController#getTodayFortune(Long) Async: Async started = false Async result = null Resolved Exception: Type = java.lang.IllegalArgumentException ModelAndView: View name = null View = null Model = null FlashMap: Attributes = null MockHttpServletResponse: Status = 200 Error message = null Headers = [Content-Security-Policy:"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; connect-src 'self' http://localhost:* https://*; font-src 'self' data:;", Referrer-Policy:"no-referrer", Permissions-Policy:"geolocation=(), microphone=(), camera=()", Access-Control-Allow-Private-Network:"true", Vary:"Origin", "Access-Control-Request-Method", "Access-Control-Request-Headers", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"1; mode=block", Cache-Control:"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} Forwarded URL = null Redirected URL = null Cookies = [] ]]>