












Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@397c3388] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1741726566 wrapping com.mysql.cj.jdbc.ConnectionImpl@51638967] will not be managed by Spring
==>  Preparing: SELECT id,username,password,real_name,email,phone,avatar,user_type,status,dept_id,last_login_time,create_time,update_time FROM user WHERE id=?
==> Parameters: 1(Long)
<==    Columns: id, username, password, real_name, email, phone, avatar, user_type, status, dept_id, last_login_time, create_time, update_time
<==        Row: 1, admin, $2a$10$o/mdlaGbhm7Fm0yrYFGICODFyqYUu/cd9Nj1xzc/qD9r3ukNZQr8W, 系统管理员, admin@system.com, 13800000000, null, 1, 1, 1, null, 2026-04-16 09:05:15, 2026-05-10 19:08:59
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@397c3388]
2026-06-11 14:19:33 - 请求 | URL: http://localhost:8080/api/exam/grade | 方法: POST | IP: 127.0.0.1
2026-06-11 14:19:33 - ========== 批阅接口请求开始 ==========
2026-06-11 14:19:33 - 请求完整内容: {"answer_type":"formal_exam","answers":[{"max_score":2.0,"question_content":{"answer":"B","data":{"options":[{"key":"A","content":"允许入住并记录信息"},{"key":"B","content":"一律不予入住并立即上报属地公安机关"},{"key":"C","content":"暂时允许入住并后续核查"},{"key":"D","content":"要求重新提供证件"}]},"stem":"根据文档内容，当发现人证不符、证件伪造或冒用证件时，应采取的措施是？"},"question_id":"ea6a7f44-9077-4f19-b10e-8239a5198f4d","question_type":"single_choice","student_answer":"B"},{"max_score":2.0,"question_content":{"answer":"B","data":{"options":[{"key":"A","content":"安保人员"},{"key":"B","content":"前台工作人员"},{"key":"C","content":"经理"},{"key":"D","content":"客户"}]},"stem":"根据文档内容，谁是住宿登记的第一责任人？"},"question_id":"9d59e7c5-edfc-4517-9fb5-780b389b66fb","question_type":"single_choice","student_answer":"B"}],"record_id":"683de5c4-cce6-47b4-8518-a582dce02ca4","request_id":"formal_683de5c4-cce6-47b4-8518-a582dce02ca4"}
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@cf3c606] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@26303885 wrapping com.mysql.cj.jdbc.ConnectionImpl@51638967] will not be managed by Spring
==>  Preparing: SELECT id,username,password,real_name,email,phone,avatar,user_type,status,dept_id,last_login_time,create_time,update_time FROM user WHERE id=?
==> Parameters: 1(Long)
<==    Columns: id, username, password, real_name, email, phone, avatar, user_type, status, dept_id, last_login_time, create_time, update_time
<==        Row: 1, admin, $2a$10$o/mdlaGbhm7Fm0yrYFGICODFyqYUu/cd9Nj1xzc/qD9r3ukNZQr8W, 系统管理员, admin@system.com, 13800000000, null, 1, 1, 1, null, 2026-04-16 09:05:15, 2026-05-10 19:08:59
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@cf3c606]
2026-06-11 14:19:33 - 当前用户ID: 1
2026-06-11 14:19:33 - 答案数量: 2
2026-06-11 14:19:33 - 检测到正式考试模式: recordId=683de5c4-cce6-47b4-8518-a582dce02ca4
2026-06-11 14:19:33 - 通过recordId提交考试: userId=1, recordId=683de5c4-cce6-47b4-8518-a582dce02ca4, 答案数量=2
2026-06-11 14:19:33 - gradeAnswersForRecord 开始
2026-06-11 14:19:33 - 请求参数: recordId=683de5c4-cce6-47b4-8518-a582dce02ca4, userId=1, answerType=formal_exam, answers count=2
Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a]
JDBC Connection [HikariProxyConnection@1859153704 wrapping com.mysql.cj.jdbc.ConnectionImpl@51638967] will be managed by Spring
==>  Preparing: SELECT id,record_id,paper_id,answer_type,user_id,status,total_score,submit_time,graded_time,graded_by,time_spent,start_time,last_active_time,created_at,updated_at FROM exam_record WHERE (record_id = ?)
==> Parameters: 683de5c4-cce6-47b4-8518-a582dce02ca4(String)
<==    Columns: id, record_id, paper_id, answer_type, user_id, status, total_score, submit_time, graded_time, graded_by, time_spent, start_time, last_active_time, created_at, updated_at
<==        Row: 263, 683de5c4-cce6-47b4-8518-a582dce02ca4, ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b, formal_exam, 1, graded, 0.00, 2026-06-11 14:18:51, 2026-06-11 14:18:51, null, 401, 2026-06-11 14:12:09, 2026-06-11 14:12:09, 2026-06-11 14:12:04, 2026-06-11 14:18:51
<==      Total: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] from current transaction
==>  Preparing: SELECT id,paper_id,title,description,total_score,duration,question_count,status,permission_scope,dept_id,question_ids,created_by,created_at,updated_at,publish_time,deadline FROM exam_paper WHERE (paper_id = ?)
==> Parameters: ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b(String)
<==    Columns: id, paper_id, title, description, total_score, duration, question_count, status, permission_scope, dept_id, question_ids, created_by, created_at, updated_at, publish_time, deadline
<==        Row: 65, ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b, 自动生成的试卷, <<BLOB>>, 4.00, 120, 2, published, 本部门, 1, <<BLOB>>, 1, 2026-06-11 14:11:57, 2026-06-11 14:12:04, 2026-06-11 14:12:04, null
<==      Total: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a]
2026-06-11 14:19:33 - 检测到空试卷提交: isBlankSubmission=false
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] from current transaction
==>  Preparing: SELECT id,question_id,question_type,difficulty,tags,score,version,document_id,exclude_stems,knowledge_base_path,source_context,chunk_ids,source_chunks_used,exam_count,correct_count,last_exam_time,page_numbers,content,status,reviewer_comment,created_at,updated_at,is_deleted FROM question WHERE (question_id = ?)
==> Parameters: ea6a7f44-9077-4f19-b10e-8239a5198f4d(String)
<==    Columns: id, question_id, question_type, difficulty, tags, score, version, document_id, exclude_stems, knowledge_base_path, source_context, chunk_ids, source_chunks_used, exam_count, correct_count, last_exam_time, page_numbers, content, status, reviewer_comment, created_at, updated_at, is_deleted
<==        Row: 826, ea6a7f44-9077-4f19-b10e-8239a5198f4d, single_choice, 3, <<BLOB>>, 2.00, 1.0, 80, 根据文档内容，当发现人证不符、证件伪造或冒用证件时，应采取的措施是？, null, <<BLOB>>, <<BLOB>>, 22, 0, 0, null, <<BLOB>>, <<BLOB>>, pending, <<BLOB>>, 2026-06-10 06:24:40, 2026-06-10 06:24:40, 0
<==      Total: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a]
2026-06-11 14:19:33 - 转换题目内容失败
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "explanation" (class top.tqx.demo_1.dto.ExamGradeRequest$QuestionContent), not marked as ignorable (3 known properties: "stem", "data", "answer"])
 at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: top.tqx.demo_1.dto.ExamGradeRequest$QuestionContent["explanation"])
	at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)
	at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:1138)
	at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:2224)
	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1719)
	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1697)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:320)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)
	at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
	at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:4801)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2974)
	at com.fasterxml.jackson.databind.ObjectMapper.treeToValue(ObjectMapper.java:3438)
	at top.tqx.demo_1.service.impl.ExamServiceImpl.gradeAnswersForRecord(ExamServiceImpl.java:490)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:392)
	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$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)
	at top.tqx.demo_1.service.impl.ExamServiceImpl$$SpringCGLIB$$0.gradeAnswersForRecord(<generated>)
	at top.tqx.demo_1.controller.ExamController.gradeAnswers(ExamController.java:330)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)
	at top.tqx.demo_1.aspect.LogAspect.around(LogAspect.java:43)
	at jdk.internal.reflect.GeneratedMethodAccessor191.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:637)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:627)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)
	at top.tqx.demo_1.controller.ExamController$$SpringCGLIB$$0.gradeAnswers(<generated>)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)
	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:926)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)
	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 jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
	at java.base/java.lang.Thread.run(Unknown Source)
2026-06-11 14:19:33 - 题目内容为空，已设置默认值: questionId=ea6a7f44-9077-4f19-b10e-8239a5198f4d
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] from current transaction
==>  Preparing: SELECT id,question_id,question_type,difficulty,tags,score,version,document_id,exclude_stems,knowledge_base_path,source_context,chunk_ids,source_chunks_used,exam_count,correct_count,last_exam_time,page_numbers,content,status,reviewer_comment,created_at,updated_at,is_deleted FROM question WHERE (question_id = ?)
==> Parameters: 9d59e7c5-edfc-4517-9fb5-780b389b66fb(String)
<==    Columns: id, question_id, question_type, difficulty, tags, score, version, document_id, exclude_stems, knowledge_base_path, source_context, chunk_ids, source_chunks_used, exam_count, correct_count, last_exam_time, page_numbers, content, status, reviewer_comment, created_at, updated_at, is_deleted
<==        Row: 825, 9d59e7c5-edfc-4517-9fb5-780b389b66fb, single_choice, 3, <<BLOB>>, 2.00, 1.0, 80, 根据文档内容，谁是住宿登记的第一责任人？, null, <<BLOB>>, <<BLOB>>, 22, 0, 0, null, <<BLOB>>, <<BLOB>>, pending, <<BLOB>>, 2026-06-10 06:24:40, 2026-06-10 06:24:40, 0
<==      Total: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a]
2026-06-11 14:19:33 - 转换题目内容失败
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "explanation" (class top.tqx.demo_1.dto.ExamGradeRequest$QuestionContent), not marked as ignorable (3 known properties: "stem", "data", "answer"])
 at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: top.tqx.demo_1.dto.ExamGradeRequest$QuestionContent["explanation"])
	at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)
	at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:1138)
	at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:2224)
	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1719)
	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1697)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:320)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)
	at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
	at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:4801)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2974)
	at com.fasterxml.jackson.databind.ObjectMapper.treeToValue(ObjectMapper.java:3438)
	at top.tqx.demo_1.service.impl.ExamServiceImpl.gradeAnswersForRecord(ExamServiceImpl.java:490)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:392)
	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$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)
	at top.tqx.demo_1.service.impl.ExamServiceImpl$$SpringCGLIB$$0.gradeAnswersForRecord(<generated>)
	at top.tqx.demo_1.controller.ExamController.gradeAnswers(ExamController.java:330)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)
	at top.tqx.demo_1.aspect.LogAspect.around(LogAspect.java:43)
	at jdk.internal.reflect.GeneratedMethodAccessor191.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:637)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:627)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)
	at top.tqx.demo_1.controller.ExamController$$SpringCGLIB$$0.gradeAnswers(<generated>)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)
	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:926)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)
	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 jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
	at java.base/java.lang.Thread.run(Unknown Source)
2026-06-11 14:19:33 - 题目内容为空，已设置默认值: questionId=9d59e7c5-edfc-4517-9fb5-780b389b66fb
2026-06-11 14:19:33 - Service层：开始批改题目
2026-06-11 14:19:33 - Service层参数详情:
2026-06-11 14:19:33 -   - userId: 1
2026-06-11 14:19:33 -   - paperId: ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b
2026-06-11 14:19:33 -   - sessionId: null
2026-06-11 14:19:33 -   - answerType: formal_exam
2026-06-11 14:19:33 -   - 答案数量: 2
2026-06-11 14:19:33 -   - AI服务地址: http://localhost:5001/exam/grade
2026-06-11 14:19:33 - Service层：准备发送请求到AI服务
2026-06-11 14:19:33 - 请求体内容: {"request_id":null,"paper_id":"ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b","session_id":null,"record_id":"683de5c4-cce6-47b4-8518-a582dce02ca4","answer_type":"formal_exam","answers":[{"question_id":"ea6a7f44-9077-4f19-b10e-8239a5198f4d","question_type":"single_choice","question_content":{"stem":"","data":null,"answer":""},"student_answer":"B","max_score":2.00},{"question_id":"9d59e7c5-edfc-4517-9fb5-780b389b66fb","question_type":"single_choice","question_content":{"stem":"","data":null,"answer":""},"student_answer":"B","max_score":2.00}]}
2026-06-11 14:19:33 - 请求超时时间: 60000ms (60秒)
2026-06-11 14:19:33 - Service层：收到AI服务响应
2026-06-11 14:19:33 - 响应原始内容: {"data":{"request_id":null,"results":[{"correct":false,"feedback":"\u6b63\u786e\u7b54\u6848: ","max_score":2.0,"question_id":"ea6a7f44-9077-4f19-b10e-8239a5198f4d","score":0},{"correct":false,"feedback":"\u6b63\u786e\u7b54\u6848: ","max_score":2.0,"question_id":"9d59e7c5-edfc-4517-9fb5-780b389b66fb","score":0}],"score_rate":0.0,"success":true,"total_max_score":4.0,"total_score":0},"message":"\u6279\u9605\u5b8c\u6210","status":"success","status_code":2021,"success":true}

2026-06-11 14:19:33 - 开始解析 2 道题
2026-06-11 14:19:33 - 第 1 题 resultNode 内容: {"correct":false,"feedback":"正确答案: ","max_score":2.0,"question_id":"ea6a7f44-9077-4f19-b10e-8239a5198f4d","score":0}
2026-06-11 14:19:33 - resultNode 字段: false, 正确答案: , 2.0, ea6a7f44-9077-4f19-b10e-8239a5198f4d, 0
2026-06-11 14:19:33 - 读取到 question_id: ea6a7f44-9077-4f19-b10e-8239a5198f4d
2026-06-11 14:19:33 - 第 2 题 resultNode 内容: {"correct":false,"feedback":"正确答案: ","max_score":2.0,"question_id":"9d59e7c5-edfc-4517-9fb5-780b389b66fb","score":0}
2026-06-11 14:19:33 - resultNode 字段: false, 正确答案: , 2.0, 9d59e7c5-edfc-4517-9fb5-780b389b66fb, 0
2026-06-11 14:19:33 - 读取到 question_id: 9d59e7c5-edfc-4517-9fb5-780b389b66fb
2026-06-11 14:19:33 - 从请求中补全 question_type: single_choice
2026-06-11 14:19:33 - 从请求中补全 question_type: single_choice
2026-06-11 14:19:33 - 处理第 1 题, 类型: single_choice, grading_status: null
2026-06-11 14:19:33 - 处理第 2 题, 类型: single_choice, grading_status: null
2026-06-11 14:19:33 - Service层：AI服务批改完成
2026-06-11 14:19:33 - 批改结果: success=true, totalScore=0, totalMaxScore=4.0, scoreRate=0.0
2026-06-11 14:19:33 - 各题目批改结果:
2026-06-11 14:19:33 -   题目1(ea6a7f44-9077-4f19-b10e-8239a5198f4d): correct=false, score=0/2.0, feedback=正确答案: 
2026-06-11 14:19:33 -   题目2(9d59e7c5-edfc-4517-9fb5-780b389b66fb): correct=false, score=0/2.0, feedback=正确答案: 
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] from current transaction
==>  Preparing: UPDATE exam_record SET record_id=?, paper_id=?, answer_type=?, user_id=?, status=?, total_score=?, submit_time=?, graded_time=?, time_spent=?, start_time=?, last_active_time=?, created_at=?, updated_at=? WHERE id=?
==> Parameters: 683de5c4-cce6-47b4-8518-a582dce02ca4(String), ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b(String), formal_exam(String), 1(Long), graded(String), 0(BigDecimal), 2026-06-11T14:19:33.301970170(LocalDateTime), 2026-06-11T14:19:33.301977884(LocalDateTime), 444(Integer), 2026-06-11T14:12:09(LocalDateTime), 2026-06-11T14:12:09(LocalDateTime), 2026-06-11T14:12:04(LocalDateTime), 2026-06-11T14:19:33.302076352(LocalDateTime), 263(Long)
<==    Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] from current transaction
==>  Preparing: INSERT INTO user_answer ( user_id, question_id, question_type, answer_type, paper_id, user_answer, score, max_score, is_correct, grading_type, feedback, created_at, updated_at ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
==> Parameters: 1(Long), ea6a7f44-9077-4f19-b10e-8239a5198f4d(String), single_choice(String), formal_exam(String), ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b(String), "B"(String), 0(BigDecimal), 2.0(BigDecimal), 0(Integer), ai(String), 正确答案: (String), 2026-06-11T14:19:33.309541700(LocalDateTime), 2026-06-11T14:19:33.309554819(LocalDateTime)
<==    Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] from current transaction
==>  Preparing: INSERT INTO user_answer ( user_id, question_id, question_type, answer_type, paper_id, user_answer, score, max_score, is_correct, grading_type, feedback, created_at, updated_at ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
==> Parameters: 1(Long), 9d59e7c5-edfc-4517-9fb5-780b389b66fb(String), single_choice(String), formal_exam(String), ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b(String), "B"(String), 0(BigDecimal), 2.0(BigDecimal), 0(Integer), ai(String), 正确答案: (String), 2026-06-11T14:19:33.315830690(LocalDateTime), 2026-06-11T14:19:33.315839473(LocalDateTime)
<==    Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a]
2026-06-11 14:19:33 - 保存了2条考试答题记录
2026-06-11 14:19:33 - gradeAnswersForRecord 完成，总分: 0
Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a]
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a]
2026-06-11 14:19:33 - 正式考试批阅成功: recordId=683de5c4-cce6-47b4-8518-a582dce02ca4
2026-06-11 14:19:33 - 响应 | 耗时: 103ms
g.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)
	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:926)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)
	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 jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.connector.CoyoteAd
