修复正式考试批题错误

This commit is contained in:
2026-06-11 23:38:54 +08:00
parent a8e28e513d
commit aec860f85f
6 changed files with 523 additions and 247 deletions

193
README.md Normal file
View File

@@ -0,0 +1,193 @@
# Knowledge Management System
基于 Spring Boot 3.2.5 的知识管理系统提供用户管理、考试系统、文件管理、AI聊天等核心功能。
## 技术栈
- **框架**: Spring Boot 3.2.5
- **语言**: Java 17
- **数据库**: MySQL 8.0+
- **缓存**: Redis 6.0+
- **ORM**: MyBatis Plus 3.5.5
- **认证**: JWT
- **API文档**: SpringDoc OpenAPI 2.3.0
- **JSON处理**: FastJSON 2.0.43
## 功能模块
| 模块 | 描述 |
| :--- | :--- |
| **用户管理** | 用户注册、登录、信息管理 |
| **角色权限** | 角色管理、权限分配 |
| **考试系统** | 试卷生成、考试管理、成绩批阅 |
| **题目管理** | 题目CRUD、统计分析 |
| **文件管理** | 文件上传、下载、权限控制 |
| **AI聊天** | 基于RAG的智能问答 |
| **搜索功能** | 全文搜索 |
| **反馈管理** | 用户反馈收集与处理 |
| **FAQ管理** | 常见问题管理 |
| **错题管理** | 错题收集与重做 |
## 快速开始
### 环境要求
- JDK 17+
- Maven 3.8+
- MySQL 8.0+
- Redis 6.0+
### 数据库配置
1. 创建数据库:
```sql
CREATE DATABASE IF NOT EXISTS knowledge_management_system
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
```
2. 执行数据库初始化脚本:
```bash
mysql -u root -p knowledge_management_system < docs/sql/knowledge_management_system.sql
```
### 运行方式
#### 开发环境
```bash
# 克隆项目
git clone <repository-url>
cd demo
# 编译运行
mvn spring-boot:run
```
#### 生产环境
```bash
# 打包
mvn clean package
# 运行
java -jar target/demo_1-0.0.1-SNAPSHOT.jar
```
#### Docker 部署
```bash
# 构建镜像
docker build -t knowledge-management-system .
# 运行容器
docker run -d -p 8080:8080 \
-e DB_USERNAME=root \
-e DB_PASSWORD=yourpassword \
-e REDIS_HOST=redis \
knowledge-management-system
```
### 配置说明
主要配置项(可通过环境变量覆盖):
| 环境变量 | 默认值 | 说明 |
| :--- | :--- | :--- |
| `DB_USERNAME` | root | 数据库用户名 |
| `DB_PASSWORD` | 123456 | 数据库密码 |
| `REDIS_HOST` | redis | Redis 主机 |
| `REDIS_PORT` | 6379 | Redis 端口 |
| `JWT_SECRET` | your-secret-key... | JWT 密钥 |
| `SWAGGER_ENABLED` | true | 是否启用 Swagger |
| `CORS_ALLOWED_ORIGINS` | * | 允许的跨域来源 |
## API 文档
启动服务后访问:
- **Swagger UI**: http://localhost:8080/api/swagger-ui.html
- **OpenAPI JSON**: http://localhost:8080/api/v3/api-docs
## 项目结构
```
├── src/main/java/top/tqx/demo_1/
│ ├── controller/ # REST API 控制层
│ ├── service/ # 业务逻辑层
│ ├── mapper/ # 数据访问层
│ ├── entity/ # 数据库实体
│ ├── dto/ # 数据传输对象
│ ├── vo/ # 视图对象
│ ├── config/ # 配置类
│ ├── interceptor/ # 拦截器
│ ├── aspect/ # AOP切面
│ ├── exception/ # 异常处理
│ ├── util/ # 工具类
│ └── Demo1Application.java
├── src/main/resources/
│ ├── application.yml # 主配置文件
│ ├── application-dev.yml # 开发环境配置
│ └── application-prod.yml # 生产环境配置
├── docs/ # 文档
│ ├── sql/ # 数据库脚本
│ └── api/ # API文档
├── uploads/ # 文件上传目录
├── logs/ # 日志目录
└── pom.xml # Maven 配置
```
## 核心功能说明
### 1. 用户认证
- JWT Token 认证
- 密码加密存储 (BCrypt)
- 权限拦截器
### 2. 考试系统
- 智能试卷生成
- 考试流程管理
- AI 自动批阅
- 成绩统计分析
### 3. 文件管理
- 大文件上传支持
- 文件版本控制
- 访问权限控制
### 4. AI 集成
- RAG 知识库检索
- 流式问答响应
- 引用来源追踪
## 安全特性
- JWT 令牌认证
- 接口限流
- 权限校验
- SQL 注入防护
- CORS 跨域配置
## 日志管理
- 控制台日志
- 文件日志(按天分割)
- 最大保留 30 天
## 开发规范
- 代码风格Google Java Style
- 异常处理:统一异常处理
- 日志记录:使用 SLF4J
## 许可证
MIT License
## 联系方式
如有问题或建议,请提交 Issue 或联系开发团队。

428
bug.txt
View File

@@ -1,150 +1,82 @@
Creating a new SqlSession Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@74a5df74] was not registered for synchronization because synchronization is not active SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@397c3388] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@833048452 wrapping com.mysql.cj.jdbc.ConnectionImpl@76ba610e] will not be managed by Spring 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=? ==> 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) ==> Parameters: 1(Long)
<== Columns: id, username, password, real_name, email, phone, avatar, user_type, status, dept_id, last_login_time, create_time, update_time <== 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 <== 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 <== Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@74a5df74] Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@397c3388]
2026-06-10 13:44:38 - 请求 | URL: http://localhost:8080/api/exam/grade | 方法: POST | IP: 127.0.0.1 2026-06-11 14:19:33 - 请求 | URL: http://localhost:8080/api/exam/grade | 方法: POST | IP: 127.0.0.1
2026-06-10 13:44:38 - ========== 批阅接口请求开始 ========== 2026-06-11 14:19:33 - ========== 批阅接口请求开始 ==========
2026-06-10 13:44:38 - 请求完整内容: {"answer_type":"practice","answers":[{"max_score":10.0,"question_content":{"answer":"加强吸烟场所维护的主要目的是确保设施设备处于良好状态,保障文明吸烟环境功能作用的最大发挥,进一步提高消费者满意度。","data":{"scoring_points":[{"point":"要点1确保设施设备良好状态","weight":0.5},{"point":"要点2保障文明吸烟环境功能发挥","weight":0.3},{"point":"要点3提高消费者满意度","weight":0.2}]},"stem":"请简述加强吸烟场所维护的主要目的及意义。"},"question_id":"806754e9-3951-4562-8641-553c42564ab8","question_type":"subjective","student_answer":"加强吸烟场所维护可以确保设施良好,提升吸烟环境,让消费者更满意。"}],"request_id":"test_005"} 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 Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@503b434e] was not registered for synchronization because synchronization is not active SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@cf3c606] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@437070389 wrapping com.mysql.cj.jdbc.ConnectionImpl@76ba610e] will not be managed by Spring 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=? ==> 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) ==> Parameters: 1(Long)
<== Columns: id, username, password, real_name, email, phone, avatar, user_type, status, dept_id, last_login_time, create_time, update_time <== 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 <== 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 <== Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@503b434e] Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@cf3c606]
2026-06-10 13:44:38 - 当前用户ID: 1 2026-06-11 14:19:33 - 当前用户ID: 1
2026-06-10 13:44:38 - 答案数量: 1 2026-06-11 14:19:33 - 答案数量: 2
2026-06-10 13:44:38 - 日常练习/模拟考模式,开始验证答案数据... 2026-06-11 14:19:33 - 检测到正式考试模式: recordId=683de5c4-cce6-47b4-8518-a582dce02ca4
2026-06-10 13:44:38 - 答案数据验证通过共1个答案 2026-06-11 14:19:33 - 通过recordId提交考试: userId=1, recordId=683de5c4-cce6-47b4-8518-a582dce02ca4, 答案数量=2
2026-06-10 13:44:38 - 空试卷标记: isBlankSubmission=false 2026-06-11 14:19:33 - gradeAnswersForRecord 开始
2026-06-10 13:44:38 - 自动生成试卷ID: paperId=68b2574e-e68b-486a-b86b-5426ab2e488b 2026-06-11 14:19:33 - 请求参数: recordId=683de5c4-cce6-47b4-8518-a582dce02ca4, userId=1, answerType=formal_exam, answers count=2
2026-06-10 13:44:38 - 自动生成sessionId: grade_e099f4df
2026-06-10 13:44:38 - ========== 准备调用批阅服务 ==========
2026-06-10 13:44:38 - 批改答案请求参数汇总:
2026-06-10 13:44:38 - - userId: 1
2026-06-10 13:44:38 - - requestId: test_005
2026-06-10 13:44:38 - - paperId: 68b2574e-e68b-486a-b86b-5426ab2e488b
2026-06-10 13:44:38 - - sessionId: grade_e099f4df
2026-06-10 13:44:38 - - answerType: practice
2026-06-10 13:44:38 - - answers count: 1
2026-06-10 13:44:38 - Service层开始批改题目
2026-06-10 13:44:38 - Service层参数详情:
2026-06-10 13:44:38 - - userId: 1
2026-06-10 13:44:38 - - paperId: 68b2574e-e68b-486a-b86b-5426ab2e488b
2026-06-10 13:44:38 - - sessionId: grade_e099f4df
2026-06-10 13:44:38 - - answerType: practice
2026-06-10 13:44:38 - - 答案数量: 1
2026-06-10 13:44:38 - - AI服务地址: http://localhost:5001/exam/grade
2026-06-10 13:44:38 - Service层准备发送请求到AI服务
2026-06-10 13:44:38 - 请求体内容: {"request_id":"test_005","paper_id":"68b2574e-e68b-486a-b86b-5426ab2e488b","session_id":"grade_e099f4df","record_id":null,"answer_type":"practice","answers":[{"question_id":"806754e9-3951-4562-8641-553c42564ab8","question_type":"subjective","question_content":{"stem":"请简述加强吸烟场所维护的主要目的及意义。","data":{"scoring_points":[{"point":"要点1确保设施设备良好状态","weight":0.5},{"point":"要点2保障文明吸烟环境功能发挥","weight":0.3},{"point":"要点3提高消费者满意度","weight":0.2}]},"answer":"加强吸烟场所维护的主要目的是确保设施设备处于良好状态,保障文明吸烟环境功能作用的最大发挥,进一步提高消费者满意度。"},"student_answer":"加强吸烟场所维护可以确保设施良好,提升吸烟环境,让消费者更满意。","max_score":10.0}]}
2026-06-10 13:44:38 - 请求超时时间: 60000ms (60秒)
2026-06-10 13:44:41 - Service层收到AI服务响应
2026-06-10 13:44:41 - 响应原始内容: {"data":{"request_id":"test_005","results":[{"details":{"highlights":["\u5b66\u751f\u7b54\u6848\u7b80\u6d01\u660e\u4e86\uff0c\u80fd\u591f\u6293\u4f4f\u6838\u5fc3\u8981\u70b9\u3002","\u5bf9\u6d88\u8d39\u8005\u6ee1\u610f\u5ea6\u7684\u8868\u8ff0\u51c6\u786e\u3002"],"overall_feedback":"\u5b66\u751f\u7684\u7b54\u6848\u57fa\u672c\u7b26\u5408\u8981\u6c42\uff0c\u80fd\u591f\u6293\u4f4f\u4e3b\u8981\u89c2\u70b9\uff0c\u4f46\u5728\u90e8\u5206\u8981\u70b9\u7684\u8868\u8fbe\u4e0a\u7565\u663e\u7b80\u7565\uff0c\u5efa\u8bae\u8fdb\u4e00\u6b65\u5b8c\u5584\u8bed\u8a00\u8868\u8ff0\u4ee5\u63d0\u9ad8\u51c6\u786e\u6027\u3002","scoring_breakdown":[{"achieved":0.8,"comment":"\u5b66\u751f\u7b54\u6848\u63d0\u5230\u4e86'\u786e\u4fdd\u8bbe\u65bd\u826f\u597d'\uff0c\u4e0e\u8981\u70b9\u57fa\u672c\u4e00\u81f4\uff0c\u4f46\u672a\u660e\u786e\u63d0\u5230'\u8bbe\u65bd\u8bbe\u5907'\u7684\u5b8c\u6574\u8868\u8ff0\u3002","point":"\u8981\u70b91\uff1a\u786e\u4fdd\u8bbe\u65bd\u8bbe\u5907\u826f\u597d\u72b6\u6001","weight":0.5},{"achieved":0.6,"comment":"\u5b66\u751f\u7b54\u6848\u63d0\u5230'\u63d0\u5347\u5438\u70df\u73af\u5883'\uff0c\u4f46\u672a\u76f4\u63a5\u4f53\u73b0'\u4fdd\u969c\u6587\u660e\u5438\u70df\u73af\u5883\u529f\u80fd\u53d1\u6325'\u7684\u6838\u5fc3\u5185\u5bb9\u3002","point":"\u8981\u70b92\uff1a\u4fdd\u969c\u6587\u660e\u5438\u70df\u73af\u5883\u529f\u80fd\u53d1\u6325","weight":0.3},{"achieved":1.0,"comment":"\u5b66\u751f\u7b54\u6848\u660e\u786e\u63d0\u5230'\u8ba9\u6d88\u8d39\u8005\u66f4\u6ee1\u610f'\uff0c\u4e0e\u8981\u70b9\u5b8c\u5168\u4e00\u81f4\u3002","point":"\u8981\u70b93\uff1a\u63d0\u9ad8\u6d88\u8d39\u8005\u6ee1\u610f\u5ea6","weight":0.2}],"shortcomings":["\u672a\u660e\u786e\u63d0\u53ca'\u8bbe\u65bd\u8bbe\u5907'\u7684\u5b8c\u6574\u8868\u8ff0\u3002","\u5bf9'\u6587\u660e\u5438\u70df\u73af\u5883\u529f\u80fd\u53d1\u6325'\u7684\u7406\u89e3\u4e0d\u591f\u6df1\u5165\u3002"]},"max_score":10.0,"question_id":"806754e9-3951-4562-8641-553c42564ab8","score":8.0}],"score_rate":80.0,"success":true,"total_max_score":10.0,"total_score":8.0},"message":"\u6279\u9605\u5b8c\u6210","status":"success","status_code":2021,"success":true}
2026-06-10 13:44:41 - 开始解析 1 道题
2026-06-10 13:44:41 - 第 1 题 resultNode 内容: {"details":{"highlights":["学生答案简洁明了,能够抓住核心要点。","对消费者满意度的表述准确。"],"overall_feedback":"学生的答案基本符合要求,能够抓住主要观点,但在部分要点的表达上略显简略,建议进一步完善语言表述以提高准确性。","scoring_breakdown":[{"achieved":0.8,"comment":"学生答案提到了'确保设施良好',与要点基本一致,但未明确提到'设施设备'的完整表述。","point":"要点1确保设施设备良好状态","weight":0.5},{"achieved":0.6,"comment":"学生答案提到'提升吸烟环境',但未直接体现'保障文明吸烟环境功能发挥'的核心内容。","point":"要点2保障文明吸烟环境功能发挥","weight":0.3},{"achieved":1.0,"comment":"学生答案明确提到'让消费者更满意',与要点完全一致。","point":"要点3提高消费者满意度","weight":0.2}],"shortcomings":["未明确提及'设施设备'的完整表述。","对'文明吸烟环境功能发挥'的理解不够深入。"]},"max_score":10.0,"question_id":"806754e9-3951-4562-8641-553c42564ab8","score":8.0}
2026-06-10 13:44:41 - resultNode 字段: , 10.0, 806754e9-3951-4562-8641-553c42564ab8, 8.0
2026-06-10 13:44:41 - 读取到 question_id: 806754e9-3951-4562-8641-553c42564ab8
2026-06-10 13:44:41 - 已解析 details 结构
2026-06-10 13:44:41 - 从请求中补全 question_type: subjective
2026-06-10 13:44:41 - 处理第 1 题, 类型: subjective, grading_status: null
2026-06-10 13:44:41 - 检测到主观题,手动解析 details
2026-06-10 13:44:41 - 主观题 feedback 已设置,长度: 408
2026-06-10 13:44:41 - Service层AI服务批改完成
2026-06-10 13:44:41 - 批改结果: success=true, totalScore=8.0, totalMaxScore=10.0, scoreRate=80.0
2026-06-10 13:44:41 - 各题目批改结果:
2026-06-10 13:44:41 - 题目1(806754e9-3951-4562-8641-553c42564ab8): correct=null, score=8.0/10.0, feedback=【亮点】
1. 学生答案简洁明了,能够抓住核心要点。
2. 对消费者满意度的表述准确。
【综合评价】
学生的答案基本符合要求,能够抓住主要观点,但在部分要点的表达上略显简略,建议进一步完善语言表述以提高准确性。
【评分详情】
- 要点1确保设施设备良好状态 (权重: 50%, 得分率: 80%)
评价: 学生答案提到了'确保设施良好',与要点基本一致,但未明确提到'设施设备'的完整表述。
- 要点2保障文明吸烟环境功能发挥 (权重: 30%, 得分率: 60%)
评价: 学生答案提到'提升吸烟环境',但未直接体现'保障文明吸烟环境功能发挥'的核心内容。
- 要点3提高消费者满意度 (权重: 20%, 得分率: 100%)
评价: 学生答案明确提到'让消费者更满意',与要点完全一致。
【可改进之处】
1. 未明确提及'设施设备'的完整表述。
2. 对'文明吸烟环境功能发挥'的理解不够深入。
2026-06-10 13:44:41 - ========== 批阅成功 ==========
2026-06-10 13:44:41 - 批阅结果: totalScore=8.0, totalMaxScore=10.0, scoreRate=80.0%
2026-06-10 13:44:41 - 开始批量保存答题记录: count=1
Creating a new SqlSession Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@70586209] Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a]
JDBC Connection [HikariProxyConnection@305915904 wrapping com.mysql.cj.jdbc.ConnectionImpl@76ba610e] will be managed by Spring JDBC Connection [HikariProxyConnection@1859153704 wrapping com.mysql.cj.jdbc.ConnectionImpl@51638967] will be managed by Spring
==> Preparing: SELECT id,user_id,question_id,question_type,answer_type,paper_id,session_id,user_answer,score,max_score,is_correct,grading_type,feedback,time_spent,paper_time_spent,created_at,updated_at FROM user_answer WHERE (user_id = ? AND question_id = ? AND paper_id = ? AND answer_type = ?) ==> 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: 1(Long), 806754e9-3951-4562-8641-553c42564ab8(String), 68b2574e-e68b-486a-b86b-5426ab2e488b(String), practice(String) ==> Parameters: 683de5c4-cce6-47b4-8518-a582dce02ca4(String)
<== Total: 0 <== 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
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@70586209] <== 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
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@70586209] from current transaction <== Total: 1
==> Preparing: INSERT INTO user_answer ( user_id, question_id, question_type, answer_type, paper_id, session_id, user_answer, score, max_score, is_correct, grading_type, feedback, created_at, updated_at ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a]
==> Parameters: 1(Long), 806754e9-3951-4562-8641-553c42564ab8(String), subjective(String), practice(String), 68b2574e-e68b-486a-b86b-5426ab2e488b(String), grade_e099f4df(String), "加强吸烟场所维护可以确保设施良好,提升吸烟环境,让消费者更满意。"(String), 8.0(BigDecimal), 10.0(BigDecimal), 0(Integer), ai(String), 【亮点】 Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] from current transaction
1. 学生答案简洁明了,能够抓住核心要点。 ==> 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 = ?)
2. 对消费者满意度的表述准确。 ==> 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
- 要点1确保设施设备良好状态 (权重: 50%, 得分率: 80%) Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a]
评价: 学生答案提到了'确保设施良好',与要点基本一致,但未明确提到'设施设备'的完整表述。 2026-06-11 14:19:33 - 检测到空试卷提交: isBlankSubmission=false
- 要点2保障文明吸烟环境功能发挥 (权重: 30%, 得分率: 60%) 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 = ?)
- 要点3提高消费者满意度 (权重: 20%, 得分率: 100%) ==> 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
1. 未明确提及'设施设备'的完整表述。 <== Total: 1
2. 对'文明吸烟环境功能发挥'的理解不够深入。(String), 2026-06-10T13:44:41.140192733(LocalDateTime), 2026-06-10T13:44:41.140943974(LocalDateTime) Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a]
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@70586209] 2026-06-11 14:19:33 - 转换题目内容失败
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@70586209] 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"])
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@70586209] at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: top.tqx.demo_1.dto.ExamGradeRequest$QuestionContent["explanation"])
2026-06-10 13:44:41 - ========== 批改答案发生未知异常 ========== at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)
2026-06-10 13:44:41 - 错误类型: org.springframework.dao.DataIntegrityViolationException at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:1138)
2026-06-10 13:44:41 - 错误信息: at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:2224)
### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`knowledge_management_system`.`user_answer`, CONSTRAINT `fk_user_answer_question` FOREIGN KEY (`question_id`) REFERENCES `question` (`question_id`) ON DELETE CASCADE ON UPDATE RESTRICT) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1719)
### The error may exist in top/tqx/demo_1/mapper/UserAnswerMapper.java (best guess) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1697)
### The error may involve top.tqx.demo_1.mapper.UserAnswerMapper.insert-Inline at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:320)
### The error occurred while setting parameters at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)
### SQL: INSERT INTO user_answer ( user_id, question_id, question_type, answer_type, paper_id, session_id, user_answer, score, max_score, is_correct, grading_type, feedback, created_at, updated_at ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
### Cause: java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`knowledge_management_system`.`user_answer`, CONSTRAINT `fk_user_answer_question` FOREIGN KEY (`question_id`) REFERENCES `question` (`question_id`) ON DELETE CASCADE ON UPDATE RESTRICT) at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:4801)
; Cannot add or update a child row: a foreign key constraint fails (`knowledge_management_system`.`user_answer`, CONSTRAINT `fk_user_answer_question` FOREIGN KEY (`question_id`) REFERENCES `question` (`question_id`) ON DELETE CASCADE ON UPDATE RESTRICT) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2974)
2026-06-10 13:44:41 - 可能的错误位置: at com.fasterxml.jackson.databind.ObjectMapper.treeToValue(ObjectMapper.java:3438)
2026-06-10 13:44:41 - at top.tqx.demo_1.service.impl.UserAnswerServiceImpl.batchSaveAnswers:UserAnswerServiceImpl.java (行号: 98) at top.tqx.demo_1.service.impl.ExamServiceImpl.gradeAnswersForRecord(ExamServiceImpl.java:490)
2026-06-10 13:44:41 - at top.tqx.demo_1.service.impl.UserAnswerServiceImpl$$SpringCGLIB$$0.batchSaveAnswers:<generated> (行号: -1)
2026-06-10 13:44:41 - at top.tqx.demo_1.controller.ExamController.saveUserAnswers:ExamController.java (行号: 583)
2026-06-10 13:44:41 - at top.tqx.demo_1.controller.ExamController.gradeAnswers:ExamController.java (行号: 416)
2026-06-10 13:44:41 - at top.tqx.demo_1.aspect.LogAspect.around:LogAspect.java (行号: 43)
2026-06-10 13:44:41 - at top.tqx.demo_1.controller.ExamController$$SpringCGLIB$$0.gradeAnswers:<generated> (行号: -1)
2026-06-10 13:44:41 - 完整堆栈:
org.springframework.dao.DataIntegrityViolationException:
### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`knowledge_management_system`.`user_answer`, CONSTRAINT `fk_user_answer_question` FOREIGN KEY (`question_id`) REFERENCES `question` (`question_id`) ON DELETE CASCADE ON UPDATE RESTRICT)
### The error may exist in top/tqx/demo_1/mapper/UserAnswerMapper.java (best guess)
### The error may involve top.tqx.demo_1.mapper.UserAnswerMapper.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO user_answer ( user_id, question_id, question_type, answer_type, paper_id, session_id, user_answer, score, max_score, is_correct, grading_type, feedback, created_at, updated_at ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
### Cause: java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`knowledge_management_system`.`user_answer`, CONSTRAINT `fk_user_answer_question` FOREIGN KEY (`question_id`) REFERENCES `question` (`question_id`) ON DELETE CASCADE ON UPDATE RESTRICT)
; Cannot add or update a child row: a foreign key constraint fails (`knowledge_management_system`.`user_answer`, CONSTRAINT `fk_user_answer_question` FOREIGN KEY (`question_id`) REFERENCES `question` (`question_id`) ON DELETE CASCADE ON UPDATE RESTRICT)
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:258)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)
at jdk.proxy2/jdk.proxy2.$Proxy87.insert(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
at jdk.proxy2/jdk.proxy2.$Proxy107.insert(Unknown Source)
at top.tqx.demo_1.service.impl.UserAnswerServiceImpl.batchSaveAnswers(UserAnswerServiceImpl.java:98)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 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.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
@@ -159,9 +91,8 @@ org.springframework.dao.DataIntegrityViolationException:
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) 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$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)
at top.tqx.demo_1.service.impl.UserAnswerServiceImpl$$SpringCGLIB$$0.batchSaveAnswers(<generated>) at top.tqx.demo_1.service.impl.ExamServiceImpl$$SpringCGLIB$$0.gradeAnswersForRecord(<generated>)
at top.tqx.demo_1.controller.ExamController.saveUserAnswers(ExamController.java:583) at top.tqx.demo_1.controller.ExamController.gradeAnswers(ExamController.java:330)
at top.tqx.demo_1.controller.ExamController.gradeAnswers(ExamController.java:416)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 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.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
@@ -172,8 +103,7 @@ org.springframework.dao.DataIntegrityViolationException:
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)
at top.tqx.demo_1.aspect.LogAspect.around(LogAspect.java:43) at top.tqx.demo_1.aspect.LogAspect.around(LogAspect.java:43)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at jdk.internal.reflect.GeneratedMethodAccessor191.invoke(Unknown Source)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.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.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:637)
@@ -240,43 +170,213 @@ org.springframework.dao.DataIntegrityViolationException:
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) 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 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
at java.base/java.lang.Thread.run(Unknown Source) at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`knowledge_management_system`.`user_answer`, CONSTRAINT `fk_user_answer_question` FOREIGN KEY (`question_id`) REFERENCES `question` (`question_id`) ON DELETE CASCADE ON UPDATE RESTRICT) 2026-06-11 14:19:33 - 题目内容为空,已设置默认值: questionId=ea6a7f44-9077-4f19-b10e-8239a5198f4d
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:118) Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] from current transaction
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ==> 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 = ?)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:912) ==> Parameters: 9d59e7c5-edfc-4517-9fb5-780b389b66fb(String)
at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354) <== 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
at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) <== 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
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) <== Total: 1
at jdk.internal.reflect.GeneratedMethodAccessor30.invoke(Unknown Source) Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 2026-06-11 14:19:33 - 转换题目内容失败
at java.base/java.lang.reflect.Method.invoke(Unknown Source) 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 org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: top.tqx.demo_1.dto.ExamGradeRequest$QuestionContent["explanation"])
at jdk.proxy3/jdk.proxy3.$Proxy163.execute(Unknown Source) at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48) at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:1138)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75) 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.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
at jdk.proxy2/jdk.proxy2.$Proxy161.update(Unknown Source) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) 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.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at jdk.proxy2/jdk.proxy2.$Proxy160.update(Unknown Source) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) 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.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255)
... 102 common frames omitted at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)
2026-06-10 13:44:41 - 响应 | 耗时: 2889ms 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

View File

@@ -11,7 +11,7 @@
Target Server Version : 80046 (8.0.46-0ubuntu0.22.04.2) Target Server Version : 80046 (8.0.46-0ubuntu0.22.04.2)
File Encoding : 65001 File Encoding : 65001
Date: 10/06/2026 20:42:07 Date: 11/06/2026 23:00:41
*/ */
SET NAMES utf8mb4; SET NAMES utf8mb4;
@@ -43,7 +43,7 @@ CREATE TABLE `collection` (
INDEX `idx_department`(`department` ASC) USING BTREE, INDEX `idx_department`(`department` ASC) USING BTREE,
INDEX `idx_owner_type`(`owner_type` ASC) USING BTREE, INDEX `idx_owner_type`(`owner_type` ASC) USING BTREE,
INDEX `idx_visibility`(`visibility` ASC) USING BTREE INDEX `idx_visibility`(`visibility` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 31 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '知识库存放路径表' ROW_FORMAT = DYNAMIC; ) ENGINE = InnoDB AUTO_INCREMENT = 33 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '知识库存放路径表' ROW_FORMAT = DYNAMIC;
-- ---------------------------- -- ----------------------------
-- Records of collection -- Records of collection
@@ -51,6 +51,8 @@ CREATE TABLE `collection` (
INSERT INTO `collection` VALUES (23, 'dept_1_kb', '/knowledge/dept_1_kb', '1', '总公司', 'department', 'public', NULL, '部门1知识库', '自动创建的向量库', '2026-06-02 14:05:53', '2026-06-02 14:05:53', 'LATEST', NULL, NULL); INSERT INTO `collection` VALUES (23, 'dept_1_kb', '/knowledge/dept_1_kb', '1', '总公司', 'department', 'public', NULL, '部门1知识库', '自动创建的向量库', '2026-06-02 14:05:53', '2026-06-02 14:05:53', 'LATEST', NULL, NULL);
INSERT INTO `collection` VALUES (28, 'dept_3_kb', '/knowledge/dept_3_kb', '1', '技术部', 'department', 'public', NULL, '部门3知识库', '自动创建的向量库', '2026-06-10 04:58:28', '2026-06-10 04:58:28', 'LATEST', NULL, NULL); INSERT INTO `collection` VALUES (28, 'dept_3_kb', '/knowledge/dept_3_kb', '1', '技术部', 'department', 'public', NULL, '部门3知识库', '自动创建的向量库', '2026-06-10 04:58:28', '2026-06-10 04:58:28', 'LATEST', NULL, NULL);
INSERT INTO `collection` VALUES (30, 'dept_6_kb', '/knowledge/dept_6_kb', '1', '人事部门', 'department', 'public', NULL, '部门6知识库', '自动创建的向量库', '2026-06-10 06:19:34', '2026-06-10 06:19:34', 'LATEST', NULL, NULL); INSERT INTO `collection` VALUES (30, 'dept_6_kb', '/knowledge/dept_6_kb', '1', '人事部门', 'department', 'public', NULL, '部门6知识库', '自动创建的向量库', '2026-06-10 06:19:34', '2026-06-10 06:19:34', 'LATEST', NULL, NULL);
INSERT INTO `collection` VALUES (31, 'dept_5_kb', '/knowledge/dept_5_kb', '1', '管理部门', 'department', 'public', NULL, '部门5知识库', '自动创建的向量库', '2026-06-10 14:06:57', '2026-06-10 14:06:57', 'LATEST', NULL, NULL);
INSERT INTO `collection` VALUES (32, 'dept_4_kb', '/knowledge/dept_4_kb', '1', '采购部门', 'department', 'public', NULL, '部门4知识库', '自动创建的向量库', '2026-06-11 13:24:09', '2026-06-11 13:24:09', 'LATEST', NULL, NULL);
-- ---------------------------- -- ----------------------------
-- Table structure for collection_file -- Table structure for collection_file
@@ -72,16 +74,16 @@ CREATE TABLE `collection_file` (
INDEX `idx_doc_name`(`doc_name` ASC) USING BTREE, INDEX `idx_doc_name`(`doc_name` ASC) USING BTREE,
INDEX `idx_file_id`(`file_id` ASC) USING BTREE, INDEX `idx_file_id`(`file_id` ASC) USING BTREE,
CONSTRAINT `fk_collection_file_file` FOREIGN KEY (`file_id`) REFERENCES `file` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT CONSTRAINT `fk_collection_file_file` FOREIGN KEY (`file_id`) REFERENCES `file` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 61 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '向量库文件关联表' ROW_FORMAT = DYNAMIC; ) ENGINE = InnoDB AUTO_INCREMENT = 65 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '向量库文件关联表' ROW_FORMAT = DYNAMIC;
-- ---------------------------- -- ----------------------------
-- Records of collection_file -- Records of collection_file
-- ---------------------------- -- ----------------------------
INSERT INTO `collection_file` VALUES (42, 'dept_1_kb', '1.docx', 72, 'resources/rule/总公司/南京分公司/技术部/1/v1/1.docx', '.docx', 1, '2026-06-02 22:06:41', '2026-06-05 16:10:42'); INSERT INTO `collection_file` VALUES (42, 'dept_1_kb', '1.docx', 72, 'resources/rule/总公司/南京分公司/技术部/1/v1/1.docx', '.docx', 1, '2026-06-02 22:06:41', '2026-06-05 16:10:42');
INSERT INTO `collection_file` VALUES (49, 'dept_1_kb', '需求分析.docx', 74, 'resources/rule/总公司/需求分析/v5/需求分析.docx', '.docx', 1, '2026-06-04 10:23:36', '2026-06-04 10:23:36');
INSERT INTO `collection_file` VALUES (55, 'dept_1_kb', '3.docx', 71, 'resources/rule/总公司/3/v1/3.docx', '.docx', 1, '2026-06-10 11:48:05', '2026-06-10 11:48:05'); INSERT INTO `collection_file` VALUES (55, 'dept_1_kb', '3.docx', 71, 'resources/rule/总公司/3/v1/3.docx', '.docx', 1, '2026-06-10 11:48:05', '2026-06-10 11:48:05');
INSERT INTO `collection_file` VALUES (57, 'dept_3_kb', 'longrule.docx', 76, 'resources/rule/总公司/南京分公司/技术部/longrule/v1/longrule.docx', '.docx', 1, '2026-06-10 13:01:38', '2026-06-10 13:01:38'); INSERT INTO `collection_file` VALUES (57, 'dept_3_kb', 'longrule.docx', 76, 'resources/rule/总公司/南京分公司/技术部/longrule/v1/longrule.docx', '.docx', 1, '2026-06-10 13:01:38', '2026-06-10 13:01:38');
INSERT INTO `collection_file` VALUES (59, 'dept_1_kb', '参考样例.pdf', 79, 'resources/rule/总公司/参考样例/v8/参考样例.pdf', '.pdf', 1, '2026-06-10 13:14:08', '2026-06-10 13:14:08'); INSERT INTO `collection_file` VALUES (59, 'dept_1_kb', '参考样例.pdf', 79, 'resources/rule/总公司/参考样例/v8/参考样例.pdf', '.pdf', 1, '2026-06-10 13:14:08', '2026-06-10 13:14:08');
INSERT INTO `collection_file` VALUES (63, 'dept_1_kb', '需求分析.docx', 74, 'resources/rule/总公司/需求分析/v5/需求分析.docx', '.docx', 1, '2026-06-10 22:36:32', '2026-06-10 22:36:32');
-- ---------------------------- -- ----------------------------
-- Table structure for context_conversation -- Table structure for context_conversation
@@ -320,12 +322,13 @@ CREATE TABLE `exam_assignment` (
INDEX `idx_status`(`status` ASC) USING BTREE, INDEX `idx_status`(`status` ASC) USING BTREE,
CONSTRAINT `fk_exam_assignment_dept` FOREIGN KEY (`dept_id`) REFERENCES `department` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT, CONSTRAINT `fk_exam_assignment_dept` FOREIGN KEY (`dept_id`) REFERENCES `department` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT,
CONSTRAINT `fk_exam_assignment_paper` FOREIGN KEY (`paper_id`) REFERENCES `exam_paper` (`paper_id`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `fk_exam_assignment_paper` FOREIGN KEY (`paper_id`) REFERENCES `exam_paper` (`paper_id`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 70 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '试卷分配表' ROW_FORMAT = DYNAMIC; ) ENGINE = InnoDB AUTO_INCREMENT = 79 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '试卷分配表' ROW_FORMAT = DYNAMIC;
-- ---------------------------- -- ----------------------------
-- Records of exam_assignment -- Records of exam_assignment
-- ---------------------------- -- ----------------------------
INSERT INTO `exam_assignment` VALUES (69, '4e1c48d5-2019-48b6-a31b-2fea3ebf1b6f', NULL, '[1]', '[]', '[]', '2026-06-10 11:11:17', NULL, 'active', '2026-06-10 11:11:17', '2026-06-10 11:11:17'); INSERT INTO `exam_assignment` VALUES (77, 'ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b', NULL, '[1]', '[]', '[]', '2026-06-11 14:12:04', NULL, 'active', '2026-06-11 14:12:04', '2026-06-11 14:12:04');
INSERT INTO `exam_assignment` VALUES (78, '724a7aaf-6e31-4f38-a5b3-ece2ecb00ff0', NULL, '[1]', '[]', '[]', '2026-06-11 14:30:14', NULL, 'active', '2026-06-11 14:30:14', '2026-06-11 14:30:14');
-- ---------------------------- -- ----------------------------
-- Table structure for exam_paper -- Table structure for exam_paper
@@ -354,12 +357,13 @@ CREATE TABLE `exam_paper` (
INDEX `idx_status`(`status` ASC) USING BTREE, INDEX `idx_status`(`status` ASC) USING BTREE,
INDEX `idx_publish_time`(`publish_time` ASC) USING BTREE, INDEX `idx_publish_time`(`publish_time` ASC) USING BTREE,
CONSTRAINT `fk_exam_paper_user` FOREIGN KEY (`created_by`) REFERENCES `user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT CONSTRAINT `fk_exam_paper_user` FOREIGN KEY (`created_by`) REFERENCES `user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 58 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '试卷基础信息表' ROW_FORMAT = DYNAMIC; ) ENGINE = InnoDB AUTO_INCREMENT = 67 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '试卷基础信息表' ROW_FORMAT = DYNAMIC;
-- ---------------------------- -- ----------------------------
-- Records of exam_paper -- Records of exam_paper
-- ---------------------------- -- ----------------------------
INSERT INTO `exam_paper` VALUES (57, '4e1c48d5-2019-48b6-a31b-2fea3ebf1b6f', '自动生成的试卷', NULL, 4.00, 120, 2, '[\"ea6a7f44-9077-4f19-b10e-8239a5198f4d\", \"9d59e7c5-edfc-4517-9fb5-780b389b66fb\"]', '本部门', 'published', 1, '2026-06-10 11:11:11', '2026-06-10 11:11:17', '2026-06-10 11:11:17', NULL, 1); INSERT INTO `exam_paper` VALUES (65, 'ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b', '自动生成的试卷', NULL, 4.00, 120, 2, '[\"ea6a7f44-9077-4f19-b10e-8239a5198f4d\", \"9d59e7c5-edfc-4517-9fb5-780b389b66fb\"]', '本部门', 'published', 1, '2026-06-11 14:11:57', '2026-06-11 14:12:04', '2026-06-11 14:12:04', NULL, 1);
INSERT INTO `exam_paper` VALUES (66, '724a7aaf-6e31-4f38-a5b3-ece2ecb00ff0', '自动生成的试卷', NULL, 4.00, 120, 2, '[\"ea6a7f44-9077-4f19-b10e-8239a5198f4d\", \"9d59e7c5-edfc-4517-9fb5-780b389b66fb\"]', '本部门', 'published', 1, '2026-06-11 14:30:07', '2026-06-11 14:30:14', '2026-06-11 14:30:14', NULL, 1);
-- ---------------------------- -- ----------------------------
-- Table structure for exam_record -- Table structure for exam_record
@@ -392,14 +396,17 @@ CREATE TABLE `exam_record` (
INDEX `fk_exam_record_graded_by`(`graded_by` ASC) USING BTREE, INDEX `fk_exam_record_graded_by`(`graded_by` ASC) USING BTREE,
CONSTRAINT `fk_exam_record_graded_by` FOREIGN KEY (`graded_by`) REFERENCES `user` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT, CONSTRAINT `fk_exam_record_graded_by` FOREIGN KEY (`graded_by`) REFERENCES `user` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT,
CONSTRAINT `fk_exam_record_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `fk_exam_record_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 242 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '考试记录表' ROW_FORMAT = DYNAMIC; ) ENGINE = InnoDB AUTO_INCREMENT = 269 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '考试记录表' ROW_FORMAT = DYNAMIC;
-- ---------------------------- -- ----------------------------
-- Records of exam_record -- Records of exam_record
-- ---------------------------- -- ----------------------------
INSERT INTO `exam_record` VALUES (239, '17f5be59-3d81-480a-98bb-1e1a2a4556e6', '4e1c48d5-2019-48b6-a31b-2fea3ebf1b6f', 'formal_exam', 1, 'graded', 0.00, '2026-06-10 11:11:49', '2026-06-10 11:11:49', NULL, 30, '2026-06-10 11:11:19', '2026-06-10 11:11:19', '2026-06-10 11:11:17', '2026-06-10 11:11:49'); INSERT INTO `exam_record` VALUES (263, '683de5c4-cce6-47b4-8518-a582dce02ca4', 'ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b', 'formal_exam', 1, 'graded', 4.00, '2026-06-11 14:29:12', '2026-06-11 14:29:12', NULL, 1022, '2026-06-11 14:12:09', '2026-06-11 14:12:09', '2026-06-11 14:12:04', '2026-06-11 14:29:12');
INSERT INTO `exam_record` VALUES (240, 'ff860338-99ed-4211-bf85-fce6605c8fcc', '4e1c48d5-2019-48b6-a31b-2fea3ebf1b6f', 'formal_exam', 3, 'not_started', 0.00, NULL, NULL, NULL, 0, NULL, NULL, '2026-06-10 11:11:17', '2026-06-10 11:11:17'); INSERT INTO `exam_record` VALUES (264, '0325d9e2-6397-478f-b17c-000a8b1de499', 'ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b', 'formal_exam', 3, 'not_started', 0.00, NULL, NULL, NULL, 0, NULL, NULL, '2026-06-11 14:12:04', '2026-06-11 14:12:04');
INSERT INTO `exam_record` VALUES (241, '26b9fac0-3f92-4d71-a5dc-3e8b432bd580', '4e1c48d5-2019-48b6-a31b-2fea3ebf1b6f', 'formal_exam', 4, 'not_started', 0.00, NULL, NULL, NULL, 0, NULL, NULL, '2026-06-10 11:11:17', '2026-06-10 11:11:17'); INSERT INTO `exam_record` VALUES (265, '46a245cf-f014-4d3b-aad5-d970ceecdab8', 'ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b', 'formal_exam', 4, 'not_started', 0.00, NULL, NULL, NULL, 0, NULL, NULL, '2026-06-11 14:12:04', '2026-06-11 14:12:04');
INSERT INTO `exam_record` VALUES (266, 'd49d38c1-8ede-4998-97a7-a4ae87d1a10d', '724a7aaf-6e31-4f38-a5b3-ece2ecb00ff0', 'formal_exam', 1, 'graded', 4.00, '2026-06-11 14:30:21', '2026-06-11 14:30:21', NULL, 6, '2026-06-11 14:30:15', '2026-06-11 14:30:15', '2026-06-11 14:30:14', '2026-06-11 14:30:21');
INSERT INTO `exam_record` VALUES (267, 'd87c6789-38c8-4a5d-a151-580dd8d35307', '724a7aaf-6e31-4f38-a5b3-ece2ecb00ff0', 'formal_exam', 3, 'not_started', 0.00, NULL, NULL, NULL, 0, NULL, NULL, '2026-06-11 14:30:14', '2026-06-11 14:30:14');
INSERT INTO `exam_record` VALUES (268, 'b3142e25-fe23-4b15-8605-3ab9995706d5', '724a7aaf-6e31-4f38-a5b3-ece2ecb00ff0', 'formal_exam', 4, 'not_started', 0.00, NULL, NULL, NULL, 0, NULL, NULL, '2026-06-11 14:30:14', '2026-06-11 14:30:14');
-- ---------------------------- -- ----------------------------
-- Table structure for faq -- Table structure for faq
@@ -516,20 +523,23 @@ CREATE TABLE `file` (
INDEX `idx_file_category`(`file_category` ASC) USING BTREE, INDEX `idx_file_category`(`file_category` ASC) USING BTREE,
INDEX `idx_audit_status`(`audit_status` ASC) USING BTREE, INDEX `idx_audit_status`(`audit_status` ASC) USING BTREE,
INDEX `idx_file_status`(`status` ASC) USING BTREE INDEX `idx_file_status`(`status` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 81 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件管理表' ROW_FORMAT = DYNAMIC; ) ENGINE = InnoDB AUTO_INCREMENT = 84 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件管理表' ROW_FORMAT = DYNAMIC;
-- ---------------------------- -- ----------------------------
-- Records of file -- Records of file
-- ---------------------------- -- ----------------------------
INSERT INTO `file` VALUES (70, '2.docx', 'resources/rule/总公司/2/v1/2.docx', 775988, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 1, NULL, 1, 'rule', NULL, 1, 1, 'dept_1_kb/2.docx', '2026-06-02 14:11:01', '2026-06-10 05:26:37', 'FAILED', 'GENERATED', 'VECTORIZE_FAILED', '向量化失败: 向量化失败[AI端错误]: 文件上传到向量库失败: I/O error on POST request for \"http://localhost:5001/documents/upload\": Unexpected end of file from server (耗时 154115 毫秒)', '向量化失败[AI端错误]: 文件上传到向量库失败: I/O error on POST request for \"http://localhost:5001/documents/upload\": Unexpected end of file from server (耗时 154115 毫秒)', NULL); INSERT INTO `file` VALUES (70, '2.docx', 'resources/rule/总公司/2/v1/2.docx', 775988, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 1, NULL, 1, 'rule', NULL, 1, 1, 'dept_1_kb/2.docx', '2026-06-02 14:11:01', '2026-06-10 05:26:37', 'FAILED', 'GENERATED', 'VECTORIZE_FAILED', '向量化失败: 向量化失败[AI端错误]: 文件上传到向量库失败: I/O error on POST request for \"http://localhost:5001/documents/upload\": Unexpected end of file from server (耗时 154115 毫秒)', '向量化失败[AI端错误]: 文件上传到向量库失败: I/O error on POST request for \"http://localhost:5001/documents/upload\": Unexpected end of file from server (耗时 154115 毫秒)', NULL);
INSERT INTO `file` VALUES (71, '3.docx', 'resources/rule/总公司/3/v1/3.docx', 1454500, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 1, NULL, 1, 'rule', NULL, 1, 1, 'dept_1_kb/3.docx', '2026-06-02 14:11:12', '2026-06-10 04:58:48', 'INDEXED', 'GENERATED', 'EXAM_GENERATED', '题目生成完成', '生成成功,共4道题', NULL); INSERT INTO `file` VALUES (71, '3.docx', 'resources/rule/总公司/3/v1/3.docx', 1454500, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 1, NULL, 1, 'rule', NULL, 1, 1, 'dept_1_kb/3.docx', '2026-06-02 14:11:12', '2026-06-11 14:59:50', 'INDEXED', 'GENERATED', 'EXAM_GENERATED', '题目生成完成', '生成成功,共1道题', NULL);
INSERT INTO `file` VALUES (72, '1.docx', 'resources/rule/总公司/南京分公司/技术部/1/v1/1.docx', 483352, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 3, NULL, 1, 'rule', NULL, 1, 1, 'dept_3_kb/1.docx', '2026-06-03 02:01:08', '2026-06-09 06:42:02', 'INDEXED', 'GENERATED', 'EXAM_GENERATED', '题目生成完成', '生成成功,共5道题', NULL); INSERT INTO `file` VALUES (72, '1.docx', 'resources/rule/总公司/南京分公司/技术部/1/v1/1.docx', 483352, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 3, NULL, 1, 'rule', NULL, 1, 1, 'dept_3_kb/1.docx', '2026-06-03 02:01:08', '2026-06-11 14:49:41', 'INDEXED', 'GENERATED', 'EXAM_GENERATED', '题目生成完成', '生成成功,共2道题', NULL);
INSERT INTO `file` VALUES (74, '需求分析.docx', 'resources/rule/总公司/需求分析/v5/需求分析.docx', 15330, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 1, NULL, 1, 'rule', NULL, 1, 1, 'dept_1_kb/需求分析.docx', '2026-06-04 02:07:06', '2026-06-04 17:51:16', 'INDEXED', 'GENERATED', 'EXAM_GENERATED', '题目生成完成', '生成成功共1道题\n\n【AI分析结果】\n{\"question_types\":{\"fill_blank\":0,\"multiple_choice\":0,\"single_choice\":1,\"subjective\":0,\"true_false\":0},\"reason\":\"文档内容极简仅含标题无实质知识点适宜输出1道单选题覆盖基础概念。\",\"suitable_types\":[\"single_choice\"],\"total_knowledge_points\":0}', '{}'); INSERT INTO `file` VALUES (74, '需求分析.docx', 'resources/rule/总公司/需求分析/v5/需求分析.docx', 15330, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 1, NULL, 1, 'rule', NULL, 1, 1, 'dept_1_kb/需求分析.docx', '2026-06-04 02:07:06', '2026-06-10 14:36:35', 'INDEXED', 'FAILED', 'EXAM_GENERATE_FAILED', '题目生成失败: 生成失败[AI端错误]: 生成题目失败: POST请求失败: 500 INTERNAL SERVER ERROR: \"{\"error_code\":\"EXAM_ERROR\",\"message\":\"AI \\u5206\\u6790\\u540e\\u672a\\u751f\\u6210\\u6709\\u6548\\u9898\\u578b\\u914d\\u7f6e\",\"status\":\"failed\",\"status_code\":5020,\"success\":false}<EOL>\"', '生成失败[AI端错误]: 生成题目失败: POST请求失败: 500 INTERNAL SERVER ERROR: \"{\"error_code\":\"EXAM_ERROR\",\"message\":\"AI \\u5206\\u6790\\u540e\\u672a\\u751f\\u6210\\u6709\\u6548\\u9898\\u578b\\u914d\\u7f6e\",\"status\":\"failed\",\"status_code\":5020,\"success\":false}<EOL>\"', '{}');
INSERT INTO `file` VALUES (75, '参考样例.pdf', 'resources/rule/总公司/参考样例/v7/参考样例.pdf', 3588003, 'application/pdf', '.pdf', NULL, 1, 1, NULL, 1, 'rule', NULL, 1, 1, NULL, '2026-06-04 07:40:55', '2026-06-04 15:40:55', 'PENDING', 'UNGENERATED', 'UPLOADED', '文件已上传', NULL, NULL); INSERT INTO `file` VALUES (75, '参考样例.pdf', 'resources/rule/总公司/参考样例/v7/参考样例.pdf', 3588003, 'application/pdf', '.pdf', NULL, 1, 1, NULL, 1, 'rule', NULL, 1, 1, NULL, '2026-06-04 07:40:55', '2026-06-04 15:40:55', 'PENDING', 'UNGENERATED', 'UPLOADED', '文件已上传', NULL, NULL);
INSERT INTO `file` VALUES (76, 'longrule.docx', 'resources/rule/总公司/南京分公司/技术部/longrule/v1/longrule.docx', 14675, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 3, NULL, 1, 'rule', NULL, 1, 1, 'dept_3_kb/longrule.docx', '2026-06-04 13:21:25', '2026-06-10 05:02:16', 'INDEXED', 'GENERATED', 'EXAM_GENERATED', '题目生成完成', '生成成功共3道题\n\n【AI分析结果】\n{\"question_types\":{\"fill_blank\":1,\"multiple_choice\":0,\"single_choice\":2,\"subjective\":0,\"true_false\":1},\"reason\":\"知识点较基础,适合选择题和判断题。\",\"suitable_types\":[\"single_choice\",\"true_false\",\"fill_blank\"],\"total_knowledge_points\":4}', NULL); INSERT INTO `file` VALUES (76, 'longrule.docx', 'resources/rule/总公司/南京分公司/技术部/longrule/v1/longrule.docx', 14675, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 3, NULL, 1, 'rule', NULL, 1, 1, 'dept_3_kb/longrule.docx', '2026-06-04 13:21:25', '2026-06-10 05:02:16', 'INDEXED', 'GENERATED', 'EXAM_GENERATED', '题目生成完成', '生成成功共3道题\n\n【AI分析结果】\n{\"question_types\":{\"fill_blank\":1,\"multiple_choice\":0,\"single_choice\":2,\"subjective\":0,\"true_false\":1},\"reason\":\"知识点较基础,适合选择题和判断题。\",\"suitable_types\":[\"single_choice\",\"true_false\",\"fill_blank\"],\"total_knowledge_points\":4}', NULL);
INSERT INTO `file` VALUES (78, 'test.docx', 'resources/rule/总公司/南京分公司/人事部门/test/v4/test.docx', 16182, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 6, NULL, 1, 'rule', NULL, 0, 1, 'dept_6_kb/test.docx', '2026-06-10 05:02:17', '2026-06-10 05:06:05', 'DELETED', 'GENERATED', 'DELETED', '文件已软删除', '生成成功共4道题', NULL); INSERT INTO `file` VALUES (78, 'test.docx', 'resources/rule/总公司/南京分公司/人事部门/test/v4/test.docx', 16182, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 6, NULL, 1, 'rule', NULL, 0, 1, 'dept_6_kb/test.docx', '2026-06-10 05:02:17', '2026-06-10 05:06:05', 'DELETED', 'GENERATED', 'DELETED', '文件已软删除', '生成成功共4道题', NULL);
INSERT INTO `file` VALUES (79, '参考样例.pdf', 'resources/rule/总公司/参考样例/v8/参考样例.pdf', 3588003, 'application/pdf', '.pdf', NULL, 1, 1, NULL, 1, 'rule', NULL, 1, 1, 'dept_1_kb/参考样例.pdf', '2026-06-10 05:10:01', '2026-06-10 05:20:07', 'INDEXED', 'FAILED', 'EXAM_GENERATE_FAILED', '题目生成失败: 生成失败[AI端错误]: 生成题目失败: POST请求失败: I/O error on POST request for \"http://localhost:5001/exam/generate-smart\": Unexpected end of file from server', '生成失败[AI端错误]: 生成题目失败: POST请求失败: I/O error on POST request for \"http://localhost:5001/exam/generate-smart\": Unexpected end of file from server', NULL); INSERT INTO `file` VALUES (79, '参考样例.pdf', 'resources/rule/总公司/参考样例/v8/参考样例.pdf', 3588003, 'application/pdf', '.pdf', NULL, 1, 1, NULL, 1, 'rule', NULL, 1, 1, 'dept_1_kb/参考样例.pdf', '2026-06-10 05:10:01', '2026-06-10 05:20:07', 'INDEXED', 'FAILED', 'EXAM_GENERATE_FAILED', '题目生成失败: 生成失败[AI端错误]: 生成题目失败: POST请求失败: I/O error on POST request for \"http://localhost:5001/exam/generate-smart\": Unexpected end of file from server', '生成失败[AI端错误]: 生成题目失败: POST请求失败: I/O error on POST request for \"http://localhost:5001/exam/generate-smart\": Unexpected end of file from server', NULL);
INSERT INTO `file` VALUES (80, 'test.docx', 'resources/rule/总公司/南京分公司/人事部门/test/v5/test.docx', 16182, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 6, NULL, 1, 'rule', NULL, 0, 1, 'dept_6_kb/test.docx', '2026-06-10 06:19:01', '2026-06-10 06:34:49', 'DELETED', 'GENERATED', 'DELETED', '文件已软删除', '生成成功共9道题\n\n【AI分析结果】\n{\"question_types\":{\"fill_blank\":2,\"multiple_choice\":0,\"single_choice\":5,\"subjective\":0,\"true_false\":3},\"reason\":\"知识点较具体,适合单选、判断和填空题。\",\"suitable_types\":[\"single_choice\",\"true_false\",\"fill_blank\"],\"total_knowledge_points\":10}', NULL); INSERT INTO `file` VALUES (80, 'test.docx', 'resources/rule/总公司/南京分公司/人事部门/test/v5/test.docx', 16182, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 6, NULL, 1, 'rule', NULL, 0, 1, 'dept_6_kb/test.docx', '2026-06-10 06:19:01', '2026-06-10 06:34:49', 'DELETED', 'GENERATED', 'DELETED', '文件已软删除', '生成成功共9道题\n\n【AI分析结果】\n{\"question_types\":{\"fill_blank\":2,\"multiple_choice\":0,\"single_choice\":5,\"subjective\":0,\"true_false\":3},\"reason\":\"知识点较具体,适合单选、判断和填空题。\",\"suitable_types\":[\"single_choice\",\"true_false\",\"fill_blank\"],\"total_knowledge_points\":10}', NULL);
INSERT INTO `file` VALUES (81, 'test.docx', 'resources/rule/总公司/南京分公司/管理部门/test/v1/test.docx', 16182, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 5, NULL, 1, 'rule', NULL, 0, 1, 'dept_5_kb/test.docx', '2026-06-10 14:06:19', '2026-06-10 14:09:40', 'DELETED', 'GENERATED', 'DELETED', '文件已软删除', '生成成功共3道题', NULL);
INSERT INTO `file` VALUES (82, '需求分析.docx', 'resources/rule/总公司/需求分析/v6/需求分析.docx', 15330, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 1, NULL, 1, 'rule', NULL, 1, 1, 'dept_1_kb/需求分析.docx', '2026-06-10 14:30:59', '2026-06-10 14:36:44', 'PENDING', 'FAILED', 'UPLOADED', '文件已上传', '生成失败[AI端错误]: 生成题目失败: POST请求失败: 500 INTERNAL SERVER ERROR: \"{\"error_code\":\"EXAM_ERROR\",\"message\":\"AI \\u5206\\u6790\\u540e\\u672a\\u751f\\u6210\\u6709\\u6548\\u9898\\u578b\\u914d\\u7f6e\",\"status\":\"failed\",\"status_code\":5020,\"success\":false}<EOL>\"', NULL);
INSERT INTO `file` VALUES (83, 'test.docx', 'resources/rule/总公司/南京分公司/采购部门/test/v1/test.docx', 16182, 'application/vnd.openxmlformats-officedocument.word', '.docx', NULL, 1, 4, NULL, 1, 'rule', NULL, 0, 1, 'dept_4_kb/test.docx', '2026-06-11 13:23:41', '2026-06-11 13:29:25', 'DELETED', 'GENERATED', 'DELETED', '文件已软删除', '生成成功共4道题', NULL);
-- ---------------------------- -- ----------------------------
-- Table structure for operation_log -- Table structure for operation_log
@@ -675,7 +685,7 @@ CREATE TABLE `question` (
INDEX `idx_created_at`(`created_at` ASC) USING BTREE, INDEX `idx_created_at`(`created_at` ASC) USING BTREE,
INDEX `idx_knowledge_base_path`(`knowledge_base_path` ASC) USING BTREE, INDEX `idx_knowledge_base_path`(`knowledge_base_path` ASC) USING BTREE,
INDEX `idx_question_is_deleted`(`is_deleted` ASC) USING BTREE INDEX `idx_question_is_deleted`(`is_deleted` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 831 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '题目表' ROW_FORMAT = DYNAMIC; ) ENGINE = InnoDB AUTO_INCREMENT = 856 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '题目表' ROW_FORMAT = DYNAMIC;
-- ---------------------------- -- ----------------------------
-- Records of question -- Records of question
@@ -748,6 +758,31 @@ INSERT INTO `question` VALUES (827, 'c58d752c-b7f1-48a6-9d5d-54d1d3aba62a', 'tru
INSERT INTO `question` VALUES (828, '98d7f08e-a538-42fa-b501-c5aa0b5ef9d8', 'true_false', 3, NULL, 1.00, '1.0', '80', '根据文档内容,住宿登记必须坚持实名、实数、实时、实情原则。', NULL, NULL, '[\"test.docx_3\"]', 22, 0, 0, NULL, NULL, '{\"data\": {}, \"stem\": \"根据文档内容,住宿登记必须坚持实名、实数、实时、实情原则。\", \"answer\": \"true\", \"explanation\": \"文档中明确提到住宿登记坚持‘实名、实数、实时、实情’原则。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-10 06:24:40', '2026-06-10 06:24:40', 0); INSERT INTO `question` VALUES (828, '98d7f08e-a538-42fa-b501-c5aa0b5ef9d8', 'true_false', 3, NULL, 1.00, '1.0', '80', '根据文档内容,住宿登记必须坚持实名、实数、实时、实情原则。', NULL, NULL, '[\"test.docx_3\"]', 22, 0, 0, NULL, NULL, '{\"data\": {}, \"stem\": \"根据文档内容,住宿登记必须坚持实名、实数、实时、实情原则。\", \"answer\": \"true\", \"explanation\": \"文档中明确提到住宿登记坚持‘实名、实数、实时、实情’原则。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-10 06:24:40', '2026-06-10 06:24:40', 0);
INSERT INTO `question` VALUES (829, '07fc1bfb-bef7-4554-b825-639fed682ae9', 'true_false', 3, NULL, 1.00, '1.0', '80', '管理人员的日常监督检查职责包括定期核查登记台账和系统上传记录。', NULL, NULL, '[\"test.docx_5\"]', 22, 0, 0, NULL, NULL, '{\"data\": {}, \"stem\": \"管理人员的日常监督检查职责包括定期核查登记台账和系统上传记录。\", \"answer\": \"true\", \"explanation\": \"根据文档内容,管理人员负责日常监督检查,并需要定期核查登记台账和系统上传记录。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-10 06:24:40', '2026-06-10 06:24:40', 0); INSERT INTO `question` VALUES (829, '07fc1bfb-bef7-4554-b825-639fed682ae9', 'true_false', 3, NULL, 1.00, '1.0', '80', '管理人员的日常监督检查职责包括定期核查登记台账和系统上传记录。', NULL, NULL, '[\"test.docx_5\"]', 22, 0, 0, NULL, NULL, '{\"data\": {}, \"stem\": \"管理人员的日常监督检查职责包括定期核查登记台账和系统上传记录。\", \"answer\": \"true\", \"explanation\": \"根据文档内容,管理人员负责日常监督检查,并需要定期核查登记台账和系统上传记录。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-10 06:24:40', '2026-06-10 06:24:40', 0);
INSERT INTO `question` VALUES (830, '508c9b41-3e9e-43df-98df-51111e124b0a', 'fill_blank', 3, NULL, 2.00, '1.0', '80', '住宿登记坚持____、实数、实时、实情原则做到一人一证、人证相符、逐人登记、及时上传。', NULL, NULL, '[\"test.docx_3\"]', 22, 0, 0, NULL, NULL, '{\"data\": {\"blank_count\": 1}, \"stem\": \"住宿登记坚持____、实数、实时、实情原则做到一人一证、人证相符、逐人登记、及时上传。\", \"answer\": [[\"实名\"]], \"explanation\": \"根据文档内容,住宿登记坚持实名、实数、实时、实情原则。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-10 06:24:40', '2026-06-10 06:24:40', 0); INSERT INTO `question` VALUES (830, '508c9b41-3e9e-43df-98df-51111e124b0a', 'fill_blank', 3, NULL, 2.00, '1.0', '80', '住宿登记坚持____、实数、实时、实情原则做到一人一证、人证相符、逐人登记、及时上传。', NULL, NULL, '[\"test.docx_3\"]', 22, 0, 0, NULL, NULL, '{\"data\": {\"blank_count\": 1}, \"stem\": \"住宿登记坚持____、实数、实时、实情原则做到一人一证、人证相符、逐人登记、及时上传。\", \"answer\": [[\"实名\"]], \"explanation\": \"根据文档内容,住宿登记坚持实名、实数、实时、实情原则。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-10 06:24:40', '2026-06-10 06:24:40', 0);
INSERT INTO `question` VALUES (831, '307d5249-7380-4b5b-aa60-d906ad0803fc', 'single_choice', 3, NULL, 2.00, '1.0', '81', '根据文档内容,住宿登记坚持哪项原则?', NULL, NULL, '[\"test.docx_3\"]', 22, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"实名、实数、实时、实情\"}, {\"key\": \"B\", \"content\": \"实名、实数、实情、实际\"}, {\"key\": \"C\", \"content\": \"实名、实数、实时、实价\"}, {\"key\": \"D\", \"content\": \"实名、实数、实况、实情\"}]}, \"stem\": \"根据文档内容,住宿登记坚持哪项原则?\", \"answer\": \"A\", \"explanation\": \"根据文档内容,住宿登记坚持的是“实名、实数、实时、实情”原则。\", \"referenced_chunk_ids\": null}', 'deprecated', '文件向量化数据已被删除,题目自动标记为已废止', '2026-06-10 14:08:04', '2026-06-10 14:09:40', 1);
INSERT INTO `question` VALUES (832, '6b6622db-469e-4213-a83a-49a600fd7012', 'multiple_choice', 3, NULL, 4.00, '1.0', '81', '根据文档内容,因管理失职造成治安隐患、被主管部门处罚的,应追究谁的责任?', NULL, NULL, '[\"test.docx_21\"]', 22, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"仅追究门店员工责任\"}, {\"key\": \"B\", \"content\": \"追究门店管理人员及负责人责任\"}, {\"key\": \"C\", \"content\": \"追究上级主管部门责任\"}, {\"key\": \"D\", \"content\": \"追究外部合作方责任\"}]}, \"stem\": \"根据文档内容,因管理失职造成治安隐患、被主管部门处罚的,应追究谁的责任?\", \"answer\": \"B\", \"explanation\": \"根据文档第二十一条规定,因管理失职造成治安隐患、被主管部门处罚的,应追究门店管理人员及负责人责任。\", \"referenced_chunk_ids\": null}', 'deprecated', '文件向量化数据已被删除,题目自动标记为已废止', '2026-06-10 14:08:04', '2026-06-10 14:09:40', 1);
INSERT INTO `question` VALUES (833, '5f636876-95d4-45d7-8e37-6b194c16c12d', 'subjective', 3, NULL, 10.00, '1.0', '81', '根据文档内容,简述住宿登记中‘实名登记原则’的具体要求。', NULL, NULL, '[\"test.docx_3\"]', 22, 0, 0, NULL, NULL, '{\"data\": {}, \"stem\": \"根据文档内容,简述住宿登记中‘实名登记原则’的具体要求。\", \"answer\": [\"住宿登记坚持实名、实数、实时、实情原则,做到一人一证、人证相符、逐人登记、及时上传。\"], \"explanation\": \"根据文档内容,住宿登记的‘实名登记原则’具体包括:实名、实数、实时、实情,同时要确保一人一证、人证相符、逐人登记,并及时上传信息。\", \"referenced_chunk_ids\": null}', 'deprecated', '文件向量化数据已被删除,题目自动标记为已废止', '2026-06-10 14:08:04', '2026-06-10 14:09:40', 1);
INSERT INTO `question` VALUES (834, '3c8ea7a2-42bb-441b-afb1-e98a878c4c9c', 'single_choice', 3, NULL, 2.00, '1.0', '83', '根据第一章总则的内容,以下哪一项是文档的核心目标?', NULL, NULL, '[\"test.docx_0\"]', 22, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"提高工作效率\"}, {\"key\": \"B\", \"content\": \"明确组织架构\"}, {\"key\": \"C\", \"content\": \"规范操作流程\"}, {\"key\": \"D\", \"content\": \"确保合规性\"}]}, \"stem\": \"根据第一章总则的内容,以下哪一项是文档的核心目标?\", \"answer\": \"C\", \"explanation\": \"根据第一章总则的内容,规范操作流程是文档的核心目标。\", \"referenced_chunk_ids\": null}', 'deprecated', '文件向量化数据已被删除,题目自动标记为已废止', '2026-06-11 13:27:04', '2026-06-11 13:29:25', 1);
INSERT INTO `question` VALUES (835, '30f97109-e2da-4f46-bb4d-75008ac8d484', 'multiple_choice', 3, NULL, 4.00, '1.0', '83', '根据文档内容,因管理失职造成治安隐患、被主管部门处罚的,应追究谁的责任?', NULL, NULL, '[\"test.docx_21\"]', 22, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"仅追究门店员工责任\"}, {\"key\": \"B\", \"content\": \"追究门店管理人员及负责人责任\"}, {\"key\": \"C\", \"content\": \"追究上级主管部门责任\"}, {\"key\": \"D\", \"content\": \"追究所有门店员工责任\"}]}, \"stem\": \"根据文档内容,因管理失职造成治安隐患、被主管部门处罚的,应追究谁的责任?\", \"answer\": \"B\", \"explanation\": \"根据文档第二十一条规定,因管理失职造成治安隐患、被主管部门处罚的,应追究门店管理人员及负责人责任。\", \"referenced_chunk_ids\": null}', 'deprecated', '文件向量化数据已被删除,题目自动标记为已废止', '2026-06-11 13:27:04', '2026-06-11 13:29:25', 1);
INSERT INTO `question` VALUES (836, '0876a664-dde2-4378-b73d-2c4b59a61eba', 'multiple_choice', 3, NULL, 4.00, '1.0', '83', '根据文档内容,管理人员在日常监督检查中需要定期核查以下哪一项?', NULL, NULL, '[\"test.docx_5\"]', 22, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"系统上传记录\"}, {\"key\": \"B\", \"content\": \"员工薪资\"}, {\"key\": \"C\", \"content\": \"设备采购清单\"}, {\"key\": \"D\", \"content\": \"部门会议纪要\"}]}, \"stem\": \"根据文档内容,管理人员在日常监督检查中需要定期核查以下哪一项?\", \"answer\": \"A\", \"explanation\": \"根据文档第五条内容管理人员负责日常监督检查定期核查登记台账和系统上传记录。因此正确答案是A。\", \"referenced_chunk_ids\": null}', 'deprecated', '文件向量化数据已被删除,题目自动标记为已废止', '2026-06-11 13:27:04', '2026-06-11 13:29:25', 1);
INSERT INTO `question` VALUES (837, '644f396b-c40c-4ef4-9234-d1493ad2f639', 'multiple_choice', 3, NULL, 4.00, '1.0', '83', '根据文档内容,以下哪项行为是被明确禁止的?', NULL, NULL, '[\"test.docx_15\"]', 22, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"保护旅客个人隐私与信息安全\"}, {\"key\": \"B\", \"content\": \"泄露、倒卖、私自查阅旅客身份登记信息\"}, {\"key\": \"C\", \"content\": \"合理使用旅客身份信息\"}, {\"key\": \"D\", \"content\": \"合法存储旅客身份信息\"}]}, \"stem\": \"根据文档内容,以下哪项行为是被明确禁止的?\", \"answer\": \"B\", \"explanation\": \"根据文档第十五条严禁泄露、倒卖、私自查阅旅客身份登记信息因此选项B是正确答案。\", \"referenced_chunk_ids\": null}', 'deprecated', '文件向量化数据已被删除,题目自动标记为已废止', '2026-06-11 13:27:04', '2026-06-11 13:29:25', 1);
INSERT INTO `question` VALUES (838, 'f58bb6ec-fb1c-442d-a187-c84aa58da90a', 'single_choice', 3, NULL, 2.00, '1.0', '71', '在日常维护管理内容中,以下哪项是与吸烟场所巡查直接相关的?', NULL, NULL, '[\"dept_1_kb/3.docx_158\"]', 84, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"标识标牌保洁\"}, {\"key\": \"B\", \"content\": \"吸烟场所巡查\"}, {\"key\": \"C\", \"content\": \"电气线路防盗\"}, {\"key\": \"D\", \"content\": \"设施设备报修\"}]}, \"stem\": \"在日常维护管理内容中,以下哪项是与吸烟场所巡查直接相关的?\", \"answer\": \"B\", \"explanation\": \"根据文档内容,吸烟场所巡查是日常维护管理内容中的一个明确主题,与其他如标识标牌、设施设备等并列。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:48:42', '2026-06-11 14:48:42', 0);
INSERT INTO `question` VALUES (839, '019b1a25-8fa4-4253-af47-9a17b75871af', 'single_choice', 3, NULL, 2.00, '1.0', '71', '根据文档内容,吸烟点的定义是什么?', NULL, NULL, '[\"3.docx_33\"]', 84, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"指可以随意吸烟的地点\"}, {\"key\": \"B\", \"content\": \"指仅投放吸烟柱的地点,该地点仅供满足吸烟者的需求所用\"}, {\"key\": \"C\", \"content\": \"指提供烟酒销售的场所\"}, {\"key\": \"D\", \"content\": \"指禁止吸烟的区域\"}]}, \"stem\": \"根据文档内容,吸烟点的定义是什么?\", \"answer\": \"B\", \"explanation\": \"根据文档内容,吸烟点是指仅投放吸烟柱的地点,该地点仅供满足吸烟者的需求所用。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:48:42', '2026-06-11 14:48:42', 0);
INSERT INTO `question` VALUES (840, '112b1920-1390-4fec-ad35-6f9e5a933933', 'single_choice', 3, NULL, 2.00, '1.0', '71', '根据文档内容,第一章总则的核心主题是什么?', NULL, NULL, '[\"dept_1_kb/3.docx_116\"]', 84, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"具体操作流程\"}, {\"key\": \"B\", \"content\": \"第一章 总则\"}, {\"key\": \"C\", \"content\": \"部门职责划分\"}, {\"key\": \"D\", \"content\": \"财务管理制度\"}]}, \"stem\": \"根据文档内容,第一章总则的核心主题是什么?\", \"answer\": \"B\", \"explanation\": \"文档中明确指出第一章总则的主题是“第一章 总则”因此答案为B。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:48:42', '2026-06-11 14:48:42', 0);
INSERT INTO `question` VALUES (841, 'e189310e-5798-4efd-b7d5-003144f8ec19', 'single_choice', 3, NULL, 2.00, '1.0', '71', '根据文档内容,第一章建设目的的核心目标是什么?', NULL, NULL, '[\"dept_1_kb/3.docx_1\"]', 84, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"明确项目背景\"}, {\"key\": \"B\", \"content\": \"阐述项目建设的必要性\"}, {\"key\": \"C\", \"content\": \"介绍技术实现方案\"}, {\"key\": \"D\", \"content\": \"规划项目实施步骤\"}]}, \"stem\": \"根据文档内容,第一章建设目的的核心目标是什么?\", \"answer\": \"B\", \"explanation\": \"文档中提到第一章建设目的主要围绕项目的必要性和意义展开因此选项B最符合核心目标。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:48:42', '2026-06-11 14:48:42', 0);
INSERT INTO `question` VALUES (842, '765a8b44-0c64-4c71-b319-4679fbf2cfdb', 'single_choice', 3, NULL, 2.00, '1.0', '71', '根据附件2的内容附件2的主题是什么', NULL, NULL, '[\"dept_1_kb/3.docx_153\"]', 84, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"第八章 附则\"}, {\"key\": \"B\", \"content\": \"附件1\"}, {\"key\": \"C\", \"content\": \"第八章 附则 > 附件2\"}, {\"key\": \"D\", \"content\": \"附件3\"}]}, \"stem\": \"根据附件2的内容附件2的主题是什么\", \"answer\": \"C\", \"explanation\": \"根据文档内容附件2的主题明确为“第八章 附则 > 附件2”。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:48:42', '2026-06-11 14:48:42', 0);
INSERT INTO `question` VALUES (843, '746fb0a0-7b52-49e7-88de-370eb8bdb34a', 'single_choice', 3, NULL, 2.00, '1.0', '71', '根据文档内容,移交清单的份数是?', NULL, NULL, '[\"3.docx_152\"]', 84, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"一式一份\"}, {\"key\": \"B\", \"content\": \"一式两份\"}, {\"key\": \"C\", \"content\": \"一式三份\"}, {\"key\": \"D\", \"content\": \"一式四份\"}]}, \"stem\": \"根据文档内容,移交清单的份数是?\", \"answer\": \"B\", \"explanation\": \"根据文档中提到的‘本清单一式两份,甲乙双方各持一份’,可以确定移交清单为一式两份。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:48:42', '2026-06-11 14:48:42', 0);
INSERT INTO `question` VALUES (844, 'c4e7a8b3-3747-44a6-9cf8-f257b780710e', 'single_choice', 3, NULL, 2.00, '1.0', '72', '市场状态的计算公式是?', NULL, NULL, '[\"dept_1_kb/1.docx_79\"]', 73, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"市场状态=指标值\"}, {\"key\": \"B\", \"content\": \"市场状态=二级指标均值*权重\"}, {\"key\": \"C\", \"content\": \"市场状态=指标值+权重\"}, {\"key\": \"D\", \"content\": \"市场状态=指标值/权重\"}]}, \"stem\": \"市场状态的计算公式是?\", \"answer\": \"B\", \"explanation\": \"根据文档内容,市场状态的计算公式为:市场状态=二级指标均值*权重。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:49:41', '2026-06-11 14:49:41', 0);
INSERT INTO `question` VALUES (845, 'a9c931e2-fea0-41b0-b75f-d70d01630245', 'fill_blank', 3, NULL, 2.00, '1.0', '72', '市场状态的计算公式为___。', NULL, NULL, '[\"dept_1_kb/1.docx_79\"]', 73, 0, 0, NULL, NULL, '{\"data\": {\"blank_count\": 1}, \"stem\": \"市场状态的计算公式为___。\", \"answer\": [[\"市场状态=+二级指标均值\\\\*权重\"]], \"explanation\": \"根据文档内容,市场状态的计算公式为市场状态=+二级指标均值\\\\*权重。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:49:41', '2026-06-11 14:49:41', 0);
INSERT INTO `question` VALUES (846, 'ad3b8f22-5923-420e-b04d-8f47135f7c79', 'single_choice', 3, NULL, 2.00, '1.0', '71', '根据文档内容,吸烟点的定义是:', NULL, NULL, '[\"3.docx_33\"]', 84, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"仅投放吸烟柱的地点,该地点仅供满足吸烟者的需求所用。\"}, {\"key\": \"B\", \"content\": \"可以吸烟的公共场所,不限制吸烟者的行为。\"}, {\"key\": \"C\", \"content\": \"只允许非吸烟者进入的区域。\"}, {\"key\": \"D\", \"content\": \"所有人员都可以自由吸烟的场所。\"}]}, \"stem\": \"根据文档内容,吸烟点的定义是:\", \"answer\": \"A\", \"explanation\": \"根据文档内容吸烟点的定义是仅投放吸烟柱的地点该地点仅供满足吸烟者的需求所用因此选项A正确。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:54:16', '2026-06-11 14:54:16', 0);
INSERT INTO `question` VALUES (847, 'c9f12564-bbdb-4db5-aa11-ee2dde5de512', 'single_choice', 3, NULL, 2.00, '1.0', '71', '根据文档内容,第一章总则的核心目的是什么?', NULL, NULL, '[\"dept_1_kb/3.docx_116\"]', 84, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"明确组织的结构和职责\"}, {\"key\": \"B\", \"content\": \"阐述文件的整体框架和适用范围\"}, {\"key\": \"C\", \"content\": \"规定具体的业务操作流程\"}, {\"key\": \"D\", \"content\": \"制定财务预算和审计制度\"}]}, \"stem\": \"根据文档内容,第一章总则的核心目的是什么?\", \"answer\": \"B\", \"explanation\": \"文档中提到‘第一章 总则’的主题是‘第一章 总则’,其核心内容是阐述文件的整体框架和适用范围。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:54:16', '2026-06-11 14:54:16', 0);
INSERT INTO `question` VALUES (848, 'ec8bca07-15a5-49df-b479-cd0a21ab65e9', 'single_choice', 3, NULL, 2.00, '1.0', '71', '根据文档内容,第一章建设目的的核心目标是什么?', NULL, NULL, '[\"dept_1_kb/3.docx_1\"]', 84, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"明确项目的技术实现方式\"}, {\"key\": \"B\", \"content\": \"阐述项目的背景和意义\"}, {\"key\": \"C\", \"content\": \"描述项目的实施步骤\"}, {\"key\": \"D\", \"content\": \"分析项目的市场前景\"}]}, \"stem\": \"根据文档内容,第一章建设目的的核心目标是什么?\", \"answer\": \"B\", \"explanation\": \"根据文档中提到的【第一章 建设目的】主题,其核心在于阐述项目的背景和意义。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:54:16', '2026-06-11 14:54:16', 0);
INSERT INTO `question` VALUES (849, '7a165ad9-a923-4b0a-8551-a62e5d407a2d', 'single_choice', 3, NULL, 2.00, '1.0', '71', '根据附件2的内容附件2的主题是什么', NULL, NULL, '[\"dept_1_kb/3.docx_153\"]', 84, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"第八章 附则\"}, {\"key\": \"B\", \"content\": \"附件1\"}, {\"key\": \"C\", \"content\": \"第八章 附则 > 附件2\"}, {\"key\": \"D\", \"content\": \"附件3\"}]}, \"stem\": \"根据附件2的内容附件2的主题是什么\", \"answer\": \"C\", \"explanation\": \"根据文档内容附件2的主题明确为“第八章 附则 > 附件2”。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:54:16', '2026-06-11 14:54:16', 0);
INSERT INTO `question` VALUES (850, '0b2f9496-44ae-4682-84c4-bf1b19cd9eba', 'single_choice', 3, NULL, 2.00, '1.0', '71', '根据文档内容,移交清单的份数是?', NULL, NULL, '[\"3.docx_152\"]', 84, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"一式一份\"}, {\"key\": \"B\", \"content\": \"一式两份\"}, {\"key\": \"C\", \"content\": \"一式三份\"}, {\"key\": \"D\", \"content\": \"一式四份\"}]}, \"stem\": \"根据文档内容,移交清单的份数是?\", \"answer\": \"B\", \"explanation\": \"根据文档中提到的‘本清单一式两份,甲乙双方各持一份’,可以确定移交清单的份数是一式两份。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:54:16', '2026-06-11 14:54:16', 0);
INSERT INTO `question` VALUES (851, '08ea7c34-3df1-4f9f-9f70-cdb5c6e56b99', 'single_choice', 3, NULL, 2.00, '1.0', '71', '根据文档内容,调查环卫工人处置落地烟头的工作量属于以下哪一类调查?', NULL, NULL, '[\"3.docx_122\"]', 84, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"对城管及其他相关政府部门的调查\"}, {\"key\": \"B\", \"content\": \"对环卫部门的调查\"}, {\"key\": \"C\", \"content\": \"对市民生活习惯的调查\"}, {\"key\": \"D\", \"content\": \"对城市绿化情况的调查\"}]}, \"stem\": \"根据文档内容,调查环卫工人处置落地烟头的工作量属于以下哪一类调查?\", \"answer\": \"B\", \"explanation\": \"文档中明确提到3.对环卫部门的调查,其内容包括调查环卫工人处置落地烟头的工作量情况。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:54:16', '2026-06-11 14:54:16', 0);
INSERT INTO `question` VALUES (852, '2352936b-c477-40ad-9c43-988cbfb8e92a', 'single_choice', 3, NULL, 2.00, '1.0', '71', '根据文档内容以下哪项属于4A级及以上景区的特征', NULL, NULL, '[\"dept_1_kb/3.docx_15\"]', 84, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"人流量较小\"}, {\"key\": \"B\", \"content\": \"交通便利,人流量大\"}, {\"key\": \"C\", \"content\": \"仅限于自然景区\"}, {\"key\": \"D\", \"content\": \"不包括人文景区\"}]}, \"stem\": \"根据文档内容以下哪项属于4A级及以上景区的特征\", \"answer\": \"B\", \"explanation\": \"根据文档内容4A级及以上景区的特征是交通便利人流量大。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:54:16', '2026-06-11 14:54:16', 0);
INSERT INTO `question` VALUES (853, 'ab894d45-e07e-462d-80bb-5f526214cff2', 'single_choice', 3, NULL, 2.00, '1.0', '71', '根据文档内容,吸烟场所的规划和建设应优先满足以下哪类功能?', NULL, NULL, '[\"3.docx_7\", \"3.docx_8\"]', 84, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"扩展功能\"}, {\"key\": \"B\", \"content\": \"基础功能\"}, {\"key\": \"C\", \"content\": \"安全保障功能\"}, {\"key\": \"D\", \"content\": \"互动体验功能\"}]}, \"stem\": \"根据文档内容,吸烟场所的规划和建设应优先满足以下哪类功能?\", \"answer\": \"B\", \"explanation\": \"根据文档第四条的内容,吸烟场所的规划和建设必须首先满足基础功能,然后根据实际场景导入扩展功能。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:54:16', '2026-06-11 14:54:16', 0);
INSERT INTO `question` VALUES (854, '2aff8157-767b-42f0-9782-ca36a648046a', 'single_choice', 3, NULL, 2.00, '1.0', '71', '根据文档内容以下哪项属于C1类办公楼的定义范围', NULL, NULL, '[\"dept_1_kb/3.docx_27\"]', 84, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"国家机关的室内会议室\"}, {\"key\": \"B\", \"content\": \"位于中心商务区、交通便捷、入住率较高的高等级写字楼\"}, {\"key\": \"C\", \"content\": \"公用事业的室外营业区\"}, {\"key\": \"D\", \"content\": \"金融机构的室外办公区域\"}]}, \"stem\": \"根据文档内容以下哪项属于C1类办公楼的定义范围\", \"answer\": \"B\", \"explanation\": \"根据文档内容C1类办公楼的定义包括位于中心商务区、具有标志性和代表性、交通便捷、入住率较高的高等级写字楼。其他选项如国家机关的室内会议室、公用事业和金融机构的营业区均被明确排除在C1类办公楼之外。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:54:16', '2026-06-11 14:54:16', 0);
INSERT INTO `question` VALUES (855, 'bdb9726b-2cba-4e64-85ae-9113f154e100', 'single_choice', 3, NULL, 2.00, '1.0', '71', '以下哪一项属于场所分类的A1类别', NULL, NULL, '[\"dept_1_kb/3.docx_171\"]', 72, 0, 0, NULL, NULL, '{\"data\": {\"options\": [{\"key\": \"A\", \"content\": \"卫生医疗机构\"}, {\"key\": \"B\", \"content\": \"公园、广场、旅游景区和大型场馆\"}, {\"key\": \"C\", \"content\": \"车站、机场、码头、交通枢纽及高速服务区\"}, {\"key\": \"D\", \"content\": \"城镇道路、街道\"}]}, \"stem\": \"以下哪一项属于场所分类的A1类别\", \"answer\": \"B\", \"explanation\": \"根据文档内容A1类别明确包括公园、广场、旅游景区和大型场馆。\", \"referenced_chunk_ids\": null}', 'pending', NULL, '2026-06-11 14:59:50', '2026-06-11 14:59:50', 0);
-- ---------------------------- -- ----------------------------
-- Table structure for role -- Table structure for role
@@ -947,29 +982,21 @@ CREATE TABLE `user_answer` (
INDEX `idx_created_at`(`created_at` ASC) USING BTREE, INDEX `idx_created_at`(`created_at` ASC) USING BTREE,
CONSTRAINT `fk_user_answer_question` FOREIGN KEY (`question_id`) REFERENCES `question` (`question_id`) ON DELETE CASCADE ON UPDATE RESTRICT, CONSTRAINT `fk_user_answer_question` FOREIGN KEY (`question_id`) REFERENCES `question` (`question_id`) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT `fk_user_answer_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `fk_user_answer_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 402 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户答题记录表' ROW_FORMAT = DYNAMIC; ) ENGINE = InnoDB AUTO_INCREMENT = 451 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户答题记录表' ROW_FORMAT = DYNAMIC;
-- ---------------------------- -- ----------------------------
-- Records of user_answer -- Records of user_answer
-- ---------------------------- -- ----------------------------
INSERT INTO `user_answer` VALUES (378, 1, 'dd7c6ff8-faad-47ea-a844-e22b5090d219', 'single_choice', 'formal_exam', '35402037-40f1-4119-b1d6-6ed68d7268f8', NULL, '\"A\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 05:27:19', '2026-06-10 05:27:19'); INSERT INTO `user_answer` VALUES (441, 1, 'd009ac1a-b415-4b51-ab57-4cf10fb16c55', 'true_false', 'practice', '53d75852-16af-4054-8a16-846850e55ac6', 'grade_49b45ca7', '\"T\"', 0.00, 1.00, 0, 'ai', '正确答案: ', NULL, NULL, 0, 0, '2026-06-11 14:27:23', '2026-06-11 14:27:23');
INSERT INTO `user_answer` VALUES (379, 1, 'a79742d8-4914-41c4-9c0e-1710859e5195', 'fill_blank', 'formal_exam', '35402037-40f1-4119-b1d6-6ed68d7268f8', NULL, '[\"1\", \"1\"]', 0.00, 2.00, 0, 'ai', NULL, NULL, NULL, 0, 0, '2026-06-10 05:27:19', '2026-06-10 05:27:19'); INSERT INTO `user_answer` VALUES (442, 1, 'f139af44-277a-4b6e-88e0-dbd2539b24b6', 'true_false', 'practice', '53d75852-16af-4054-8a16-846850e55ac6', 'grade_49b45ca7', '\"F\"', 0.00, 1.00, 0, 'ai', '正确答案: 错', NULL, NULL, 0, 0, '2026-06-11 14:27:23', '2026-06-11 14:27:23');
INSERT INTO `user_answer` VALUES (383, 1, 'ea6a7f44-9077-4f19-b10e-8239a5198f4d', 'single_choice', 'formal_exam', 'a310b3e9-e1c6-4afb-9945-abd7565cfcb5', NULL, '\"B\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 06:37:47', '2026-06-10 06:37:47'); INSERT INTO `user_answer` VALUES (443, 1, 'ea6a7f44-9077-4f19-b10e-8239a5198f4d', 'single_choice', 'formal_exam', 'ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b', NULL, '\"B\"', 2.00, 2.00, 1, 'ai', '正确', NULL, NULL, 0, 0, '2026-06-11 14:29:12', '2026-06-11 14:29:12');
INSERT INTO `user_answer` VALUES (384, 1, '9d59e7c5-edfc-4517-9fb5-780b389b66fb', 'single_choice', 'formal_exam', 'a310b3e9-e1c6-4afb-9945-abd7565cfcb5', NULL, '\"B\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 06:37:47', '2026-06-10 06:37:47'); INSERT INTO `user_answer` VALUES (444, 1, '9d59e7c5-edfc-4517-9fb5-780b389b66fb', 'single_choice', 'formal_exam', 'ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b', NULL, '\"B\"', 2.00, 2.00, 1, 'ai', '正确', NULL, NULL, 0, 0, '2026-06-11 14:29:12', '2026-06-11 14:29:12');
INSERT INTO `user_answer` VALUES (385, 1, '409c8cc2-7bcd-46ce-9e86-c4d817f3a704', 'single_choice', 'formal_exam', 'a310b3e9-e1c6-4afb-9945-abd7565cfcb5', NULL, '\"B\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 06:37:47', '2026-06-10 06:37:47'); INSERT INTO `user_answer` VALUES (445, 1, 'ea6a7f44-9077-4f19-b10e-8239a5198f4d', 'single_choice', 'formal_exam', '724a7aaf-6e31-4f38-a5b3-ece2ecb00ff0', NULL, '\"B\"', 2.00, 2.00, 1, 'ai', '正确', NULL, NULL, 0, 0, '2026-06-11 14:30:21', '2026-06-11 14:30:21');
INSERT INTO `user_answer` VALUES (386, 1, 'ea6a7f44-9077-4f19-b10e-8239a5198f4d', 'single_choice', 'formal_exam', 'd55c332f-4de2-42ec-9859-d3dc2f68c8b5', NULL, '\"B\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 10:47:18', '2026-06-10 10:47:18'); INSERT INTO `user_answer` VALUES (446, 1, '9d59e7c5-edfc-4517-9fb5-780b389b66fb', 'single_choice', 'formal_exam', '724a7aaf-6e31-4f38-a5b3-ece2ecb00ff0', NULL, '\"B\"', 2.00, 2.00, 1, 'ai', '正确', NULL, NULL, 0, 0, '2026-06-11 14:30:21', '2026-06-11 14:30:21');
INSERT INTO `user_answer` VALUES (387, 1, '9d59e7c5-edfc-4517-9fb5-780b389b66fb', 'single_choice', 'formal_exam', 'd55c332f-4de2-42ec-9859-d3dc2f68c8b5', NULL, '\"B\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 10:47:18', '2026-06-10 10:47:18'); INSERT INTO `user_answer` VALUES (447, 1, 'f139af44-277a-4b6e-88e0-dbd2539b24b6', 'true_false', 'practice', '2a613948-e495-4047-b039-588fb6ea20e1', 'grade_5db0d2e5', '\"T\"', 0.00, 1.00, 0, 'ai', '正确答案: ', NULL, NULL, 0, 0, '2026-06-11 14:30:40', '2026-06-11 14:30:40');
INSERT INTO `user_answer` VALUES (388, 1, '409c8cc2-7bcd-46ce-9e86-c4d817f3a704', 'single_choice', 'formal_exam', 'd55c332f-4de2-42ec-9859-d3dc2f68c8b5', NULL, '\"\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 10:47:18', '2026-06-10 10:47:18'); INSERT INTO `user_answer` VALUES (448, 1, '7699dfb0-e03e-4e9a-8653-450d101a85d3', 'true_false', 'practice', '2a613948-e495-4047-b039-588fb6ea20e1', 'grade_5db0d2e5', '\"T\"', 0.00, 1.00, 0, 'ai', '正确答案: ', NULL, NULL, 0, 0, '2026-06-11 14:30:40', '2026-06-11 14:30:40');
INSERT INTO `user_answer` VALUES (391, 1, 'ea6a7f44-9077-4f19-b10e-8239a5198f4d', 'single_choice', 'formal_exam', '75d386fc-e4e4-46cd-89d2-513daa4c7c48', NULL, '\"B\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 10:51:08', '2026-06-10 10:51:08'); INSERT INTO `user_answer` VALUES (449, 1, 'fc512f8c-46e8-4d58-b6e5-b4172a0b311b', 'true_false', 'practice', '6690347c-a975-48b1-8e87-3bdc9cde8e85', 'grade_2930b499', '\"T\"', 1.00, 1.00, 1, 'ai', '正确', NULL, NULL, 0, 0, '2026-06-11 14:30:58', '2026-06-11 14:30:58');
INSERT INTO `user_answer` VALUES (392, 1, '9d59e7c5-edfc-4517-9fb5-780b389b66fb', 'single_choice', 'formal_exam', '75d386fc-e4e4-46cd-89d2-513daa4c7c48', NULL, '\"\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 10:51:08', '2026-06-10 10:51:08'); INSERT INTO `user_answer` VALUES (450, 1, 'f139af44-277a-4b6e-88e0-dbd2539b24b6', 'true_false', 'practice', '6690347c-a975-48b1-8e87-3bdc9cde8e85', 'grade_2930b499', '\"T\"', 0.00, 1.00, 0, 'ai', '正确答案: ', NULL, NULL, 0, 0, '2026-06-11 14:30:58', '2026-06-11 14:30:58');
INSERT INTO `user_answer` VALUES (393, 1, 'ea6a7f44-9077-4f19-b10e-8239a5198f4d', 'single_choice', 'formal_exam', 'cab7be14-dd8f-4e02-9bef-13d9a14ab89e', NULL, '\"B\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 10:52:08', '2026-06-10 10:52:08');
INSERT INTO `user_answer` VALUES (394, 1, '9d59e7c5-edfc-4517-9fb5-780b389b66fb', 'single_choice', 'formal_exam', 'cab7be14-dd8f-4e02-9bef-13d9a14ab89e', NULL, '\"B\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 10:52:08', '2026-06-10 10:52:08');
INSERT INTO `user_answer` VALUES (395, 1, '409c8cc2-7bcd-46ce-9e86-c4d817f3a704', 'single_choice', 'formal_exam', 'cab7be14-dd8f-4e02-9bef-13d9a14ab89e', NULL, '\"B\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 10:52:08', '2026-06-10 10:52:08');
INSERT INTO `user_answer` VALUES (396, 1, 'ea6a7f44-9077-4f19-b10e-8239a5198f4d', 'single_choice', 'formal_exam', '92b2dcf6-ba57-4798-8a1c-33e249ed7e20', NULL, '\"B\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 11:09:19', '2026-06-10 11:09:19');
INSERT INTO `user_answer` VALUES (397, 1, '9d59e7c5-edfc-4517-9fb5-780b389b66fb', 'single_choice', 'formal_exam', '92b2dcf6-ba57-4798-8a1c-33e249ed7e20', NULL, '\"A\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 11:09:19', '2026-06-10 11:09:19');
INSERT INTO `user_answer` VALUES (398, 1, '409c8cc2-7bcd-46ce-9e86-c4d817f3a704', 'single_choice', 'formal_exam', '92b2dcf6-ba57-4798-8a1c-33e249ed7e20', NULL, '\"A\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 11:09:19', '2026-06-10 11:09:19');
INSERT INTO `user_answer` VALUES (399, 1, 'ea6a7f44-9077-4f19-b10e-8239a5198f4d', 'single_choice', 'formal_exam', '4e1c48d5-2019-48b6-a31b-2fea3ebf1b6f', NULL, '\"B\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 11:11:49', '2026-06-10 11:11:49');
INSERT INTO `user_answer` VALUES (400, 1, '9d59e7c5-edfc-4517-9fb5-780b389b66fb', 'single_choice', 'formal_exam', '4e1c48d5-2019-48b6-a31b-2fea3ebf1b6f', NULL, '\"B\"', 0.00, 2.00, 0, 'ai', '正确答案: None', NULL, NULL, 0, 0, '2026-06-10 11:11:49', '2026-06-10 11:11:49');
-- ---------------------------- -- ----------------------------
-- Table structure for user_role -- Table structure for user_role

View File

@@ -1,47 +0,0 @@
-- =============================================================
-- 数据库迁移脚本question 表补充缺失列
-- 版本: V1.1
-- 日期: 2026-06-08
-- 说明: question表缺少 exclude_stems 和 is_deleted 列,
-- 导致 MyBatis-Plus 全字段查询时抛出 SQL 异常
-- (Unknown column 'exclude_stems' / 'is_deleted')
-- 对应实体字段: Question.excludeStems, Question.isDeleted
-- =============================================================
-- 1. 添加 exclude_stems 列(对应实体 field: excludeStems
-- 用于 AI 出题时对题干内容进行去重
ALTER TABLE `question`
ADD COLUMN `exclude_stems` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci
NULL DEFAULT NULL COMMENT '题干内容用于AI去重'
AFTER `document_id`;
-- 2. 添加 is_deleted 列(对应实体 field: isDeleted
-- 用于逻辑删除标记
ALTER TABLE `question`
ADD COLUMN `is_deleted` int NOT NULL DEFAULT 0
COMMENT '软删除标志0表示正常1表示已删除'
AFTER `updated_at`;
-- 3. 为 is_deleted 添加索引(优化按删除状态查询的性能)
ALTER TABLE `question`
ADD INDEX `idx_question_is_deleted`(`is_deleted` ASC) USING BTREE;
-- =============================================================
-- 补充迁移file 表添加 tags 列
-- 说明: File实体中有 private JsonNode tags 字段,
-- 但数据库 File 表缺少该列,导致全字段查询报错
-- =============================================================
-- 4. 添加 tags 列(对应实体 field: tags
-- 用于存储文件标签JSON数组如 ["重要", "需审批"]
ALTER TABLE `file`
ADD COLUMN `tags` json DEFAULT NULL COMMENT '文件标签'
AFTER `process_step_message`;
-- =============================================================
-- 回滚脚本(如需回滚请执行以下语句)
-- =============================================================
-- ALTER TABLE `question` DROP COLUMN `exclude_stems`;
-- ALTER TABLE `question` DROP COLUMN `is_deleted`;
-- ALTER TABLE `question` DROP INDEX `idx_question_is_deleted`;
-- ALTER TABLE `file` DROP COLUMN `tags`;

1
git.md
View File

@@ -34,6 +34,7 @@ git add . # 记录新增/修改
git add -A # 记录所有新增/修改/删除 git add -A # 记录所有新增/修改/删除
git commit -m "说明" # 提交本地 git commit -m "说明" # 提交本地
git push # 上传到仓库 git push # 上传到仓库
git push origin main -f # 强制上传到远程
git config --global credential.helper manager # 记住密码 git config --global credential.helper manager # 记住密码
``` ```

View File

@@ -1,6 +1,7 @@
package top.tqx.demo_1.dto; package top.tqx.demo_1.dto;
import com.fasterxml.jackson.annotation.JsonAlias; import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data; import lombok.Data;
@@ -63,6 +64,7 @@ public class ExamGradeRequest implements Serializable {
} }
@Data @Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class QuestionContent implements Serializable { public static class QuestionContent implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;