From aec860f85f8704d46c5bb9404035c8a737fa1217 Mon Sep 17 00:00:00 2001 From: guxz <1921137080@qq.com> Date: Thu, 11 Jun 2026 23:38:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=AD=A3=E5=BC=8F=E8=80=83?= =?UTF-8?q?=E8=AF=95=E6=89=B9=E9=A2=98=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 193 ++++++++ bug.txt | 428 +++++++++++------- docs/sql/knowledge_management_system.sql | 99 ++-- ...60608_add_exclude_stems_and_is_deleted.sql | 47 -- git.md | 1 + .../top/tqx/demo_1/dto/ExamGradeRequest.java | 2 + 6 files changed, 523 insertions(+), 247 deletions(-) create mode 100644 README.md delete mode 100644 docs/sql/migration_20260608_add_exclude_stems_and_is_deleted.sql diff --git a/README.md b/README.md new file mode 100644 index 0000000..27ef2f8 --- /dev/null +++ b/README.md @@ -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 +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 或联系开发团队。 \ No newline at end of file diff --git a/bug.txt b/bug.txt index be20cfb..65bffb3 100644 --- a/bug.txt +++ b/bug.txt @@ -1,150 +1,82 @@ + + + + + + + + + + Creating a new SqlSession -SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@74a5df74] 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 +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@397c3388] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1741726566 wrapping com.mysql.cj.jdbc.ConnectionImpl@51638967] will not be managed by Spring ==> Preparing: SELECT id,username,password,real_name,email,phone,avatar,user_type,status,dept_id,last_login_time,create_time,update_time FROM user WHERE id=? ==> Parameters: 1(Long) <== Columns: id, username, password, real_name, email, phone, avatar, user_type, status, dept_id, last_login_time, create_time, update_time <== Row: 1, admin, $2a$10$o/mdlaGbhm7Fm0yrYFGICODFyqYUu/cd9Nj1xzc/qD9r3ukNZQr8W, 系统管理员, admin@system.com, 13800000000, null, 1, 1, 1, null, 2026-04-16 09:05:15, 2026-05-10 19:08:59 <== Total: 1 -Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@74a5df74] -2026-06-10 13:44:38 - 请求 | URL: http://localhost:8080/api/exam/grade | 方法: POST | IP: 127.0.0.1 -2026-06-10 13:44:38 - ========== 批阅接口请求开始 ========== -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"} +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@397c3388] +2026-06-11 14:19:33 - 请求 | URL: http://localhost:8080/api/exam/grade | 方法: POST | IP: 127.0.0.1 +2026-06-11 14:19:33 - ========== 批阅接口请求开始 ========== +2026-06-11 14:19:33 - 请求完整内容: {"answer_type":"formal_exam","answers":[{"max_score":2.0,"question_content":{"answer":"B","data":{"options":[{"key":"A","content":"允许入住并记录信息"},{"key":"B","content":"一律不予入住并立即上报属地公安机关"},{"key":"C","content":"暂时允许入住并后续核查"},{"key":"D","content":"要求重新提供证件"}]},"stem":"根据文档内容,当发现人证不符、证件伪造或冒用证件时,应采取的措施是?"},"question_id":"ea6a7f44-9077-4f19-b10e-8239a5198f4d","question_type":"single_choice","student_answer":"B"},{"max_score":2.0,"question_content":{"answer":"B","data":{"options":[{"key":"A","content":"安保人员"},{"key":"B","content":"前台工作人员"},{"key":"C","content":"经理"},{"key":"D","content":"客户"}]},"stem":"根据文档内容,谁是住宿登记的第一责任人?"},"question_id":"9d59e7c5-edfc-4517-9fb5-780b389b66fb","question_type":"single_choice","student_answer":"B"}],"record_id":"683de5c4-cce6-47b4-8518-a582dce02ca4","request_id":"formal_683de5c4-cce6-47b4-8518-a582dce02ca4"} Creating a new SqlSession -SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@503b434e] 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 +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@cf3c606] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@26303885 wrapping com.mysql.cj.jdbc.ConnectionImpl@51638967] will not be managed by Spring ==> Preparing: SELECT id,username,password,real_name,email,phone,avatar,user_type,status,dept_id,last_login_time,create_time,update_time FROM user WHERE id=? ==> Parameters: 1(Long) <== Columns: id, username, password, real_name, email, phone, avatar, user_type, status, dept_id, last_login_time, create_time, update_time <== Row: 1, admin, $2a$10$o/mdlaGbhm7Fm0yrYFGICODFyqYUu/cd9Nj1xzc/qD9r3ukNZQr8W, 系统管理员, admin@system.com, 13800000000, null, 1, 1, 1, null, 2026-04-16 09:05:15, 2026-05-10 19:08:59 <== Total: 1 -Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@503b434e] -2026-06-10 13:44:38 - 当前用户ID: 1 -2026-06-10 13:44:38 - 答案数量: 1 -2026-06-10 13:44:38 - 日常练习/模拟考模式,开始验证答案数据... -2026-06-10 13:44:38 - 答案数据验证通过,共1个答案 -2026-06-10 13:44:38 - 空试卷标记: isBlankSubmission=false -2026-06-10 13:44:38 - 自动生成试卷ID: paperId=68b2574e-e68b-486a-b86b-5426ab2e488b -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 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@cf3c606] +2026-06-11 14:19:33 - 当前用户ID: 1 +2026-06-11 14:19:33 - 答案数量: 2 +2026-06-11 14:19:33 - 检测到正式考试模式: recordId=683de5c4-cce6-47b4-8518-a582dce02ca4 +2026-06-11 14:19:33 - 通过recordId提交考试: userId=1, recordId=683de5c4-cce6-47b4-8518-a582dce02ca4, 答案数量=2 +2026-06-11 14:19:33 - gradeAnswersForRecord 开始 +2026-06-11 14:19:33 - 请求参数: recordId=683de5c4-cce6-47b4-8518-a582dce02ca4, userId=1, answerType=formal_exam, answers count=2 Creating a new SqlSession -Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@70586209] -JDBC Connection [HikariProxyConnection@305915904 wrapping com.mysql.cj.jdbc.ConnectionImpl@76ba610e] 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 = ?) -==> Parameters: 1(Long), 806754e9-3951-4562-8641-553c42564ab8(String), 68b2574e-e68b-486a-b86b-5426ab2e488b(String), practice(String) -<== Total: 0 -Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@70586209] -Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@70586209] from current transaction -==> 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 ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) -==> 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), 【亮点】 -1. 学生答案简洁明了,能够抓住核心要点。 -2. 对消费者满意度的表述准确。 -【综合评价】 -学生的答案基本符合要求,能够抓住主要观点,但在部分要点的表达上略显简略,建议进一步完善语言表述以提高准确性。 -【评分详情】 -- 要点1:确保设施设备良好状态 (权重: 50%, 得分率: 80%) - 评价: 学生答案提到了'确保设施良好',与要点基本一致,但未明确提到'设施设备'的完整表述。 -- 要点2:保障文明吸烟环境功能发挥 (权重: 30%, 得分率: 60%) - 评价: 学生答案提到'提升吸烟环境',但未直接体现'保障文明吸烟环境功能发挥'的核心内容。 -- 要点3:提高消费者满意度 (权重: 20%, 得分率: 100%) - 评价: 学生答案明确提到'让消费者更满意',与要点完全一致。 -【可改进之处】 -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@70586209] -Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@70586209] -Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@70586209] -2026-06-10 13:44:41 - ========== 批改答案发生未知异常 ========== -2026-06-10 13:44:41 - 错误类型: org.springframework.dao.DataIntegrityViolationException -2026-06-10 13:44:41 - 错误信息: -### 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) -2026-06-10 13:44:41 - 可能的错误位置: -2026-06-10 13:44:41 - at top.tqx.demo_1.service.impl.UserAnswerServiceImpl.batchSaveAnswers:UserAnswerServiceImpl.java (行号: 98) -2026-06-10 13:44:41 - at top.tqx.demo_1.service.impl.UserAnswerServiceImpl$$SpringCGLIB$$0.batchSaveAnswers: (行号: -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: (行号: -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) +Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] +JDBC Connection [HikariProxyConnection@1859153704 wrapping com.mysql.cj.jdbc.ConnectionImpl@51638967] will be managed by Spring +==> Preparing: SELECT id,record_id,paper_id,answer_type,user_id,status,total_score,submit_time,graded_time,graded_by,time_spent,start_time,last_active_time,created_at,updated_at FROM exam_record WHERE (record_id = ?) +==> Parameters: 683de5c4-cce6-47b4-8518-a582dce02ca4(String) +<== Columns: id, record_id, paper_id, answer_type, user_id, status, total_score, submit_time, graded_time, graded_by, time_spent, start_time, last_active_time, created_at, updated_at +<== Row: 263, 683de5c4-cce6-47b4-8518-a582dce02ca4, ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b, formal_exam, 1, graded, 0.00, 2026-06-11 14:18:51, 2026-06-11 14:18:51, null, 401, 2026-06-11 14:12:09, 2026-06-11 14:12:09, 2026-06-11 14:12:04, 2026-06-11 14:18:51 +<== Total: 1 +Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] +Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] from current transaction +==> Preparing: SELECT id,paper_id,title,description,total_score,duration,question_count,status,permission_scope,dept_id,question_ids,created_by,created_at,updated_at,publish_time,deadline FROM exam_paper WHERE (paper_id = ?) +==> Parameters: ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b(String) +<== Columns: id, paper_id, title, description, total_score, duration, question_count, status, permission_scope, dept_id, question_ids, created_by, created_at, updated_at, publish_time, deadline +<== Row: 65, ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b, 自动生成的试卷, <>, 4.00, 120, 2, published, 本部门, 1, <>, 1, 2026-06-11 14:11:57, 2026-06-11 14:12:04, 2026-06-11 14:12:04, null +<== Total: 1 +Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] +2026-06-11 14:19:33 - 检测到空试卷提交: isBlankSubmission=false +Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] from current transaction +==> Preparing: SELECT id,question_id,question_type,difficulty,tags,score,version,document_id,exclude_stems,knowledge_base_path,source_context,chunk_ids,source_chunks_used,exam_count,correct_count,last_exam_time,page_numbers,content,status,reviewer_comment,created_at,updated_at,is_deleted FROM question WHERE (question_id = ?) +==> Parameters: ea6a7f44-9077-4f19-b10e-8239a5198f4d(String) +<== Columns: id, question_id, question_type, difficulty, tags, score, version, document_id, exclude_stems, knowledge_base_path, source_context, chunk_ids, source_chunks_used, exam_count, correct_count, last_exam_time, page_numbers, content, status, reviewer_comment, created_at, updated_at, is_deleted +<== Row: 826, ea6a7f44-9077-4f19-b10e-8239a5198f4d, single_choice, 3, <>, 2.00, 1.0, 80, 根据文档内容,当发现人证不符、证件伪造或冒用证件时,应采取的措施是?, null, <>, <>, 22, 0, 0, null, <>, <>, pending, <>, 2026-06-10 06:24:40, 2026-06-10 06:24:40, 0 +<== Total: 1 +Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] +2026-06-11 14:19:33 - 转换题目内容失败 +com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "explanation" (class top.tqx.demo_1.dto.ExamGradeRequest$QuestionContent), not marked as ignorable (3 known properties: "stem", "data", "answer"]) + at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: top.tqx.demo_1.dto.ExamGradeRequest$QuestionContent["explanation"]) + at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61) + at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:1138) + at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:2224) + at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1719) + at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1697) + at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:320) + at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177) + at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323) + at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:4801) + at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2974) + at com.fasterxml.jackson.databind.ObjectMapper.treeToValue(ObjectMapper.java:3438) + at top.tqx.demo_1.service.impl.ExamServiceImpl.gradeAnswersForRecord(ExamServiceImpl.java:490) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) @@ -159,9 +91,8 @@ org.springframework.dao.DataIntegrityViolationException: 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.UserAnswerServiceImpl$$SpringCGLIB$$0.batchSaveAnswers() - at top.tqx.demo_1.controller.ExamController.saveUserAnswers(ExamController.java:583) - at top.tqx.demo_1.controller.ExamController.gradeAnswers(ExamController.java:416) + at top.tqx.demo_1.service.impl.ExamServiceImpl$$SpringCGLIB$$0.gradeAnswersForRecord() + at top.tqx.demo_1.controller.ExamController.gradeAnswers(ExamController.java:330) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) @@ -172,8 +103,7 @@ org.springframework.dao.DataIntegrityViolationException: at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) at top.tqx.demo_1.aspect.LogAspect.around(LogAspect.java:43) - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) + 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) @@ -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.TaskThread$WrappingRunnable.run(TaskThread.java:63) 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) - at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:118) - at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:912) - at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354) - at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) - at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) - at jdk.internal.reflect.GeneratedMethodAccessor30.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.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) - at jdk.proxy3/jdk.proxy3.$Proxy163.execute(Unknown Source) - at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48) - at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75) +2026-06-11 14:19:33 - 题目内容为空,已设置默认值: questionId=ea6a7f44-9077-4f19-b10e-8239a5198f4d +Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] from current transaction +==> Preparing: SELECT id,question_id,question_type,difficulty,tags,score,version,document_id,exclude_stems,knowledge_base_path,source_context,chunk_ids,source_chunks_used,exam_count,correct_count,last_exam_time,page_numbers,content,status,reviewer_comment,created_at,updated_at,is_deleted FROM question WHERE (question_id = ?) +==> Parameters: 9d59e7c5-edfc-4517-9fb5-780b389b66fb(String) +<== Columns: id, question_id, question_type, difficulty, tags, score, version, document_id, exclude_stems, knowledge_base_path, source_context, chunk_ids, source_chunks_used, exam_count, correct_count, last_exam_time, page_numbers, content, status, reviewer_comment, created_at, updated_at, is_deleted +<== Row: 825, 9d59e7c5-edfc-4517-9fb5-780b389b66fb, single_choice, 3, <>, 2.00, 1.0, 80, 根据文档内容,谁是住宿登记的第一责任人?, null, <>, <>, 22, 0, 0, null, <>, <>, pending, <>, 2026-06-10 06:24:40, 2026-06-10 06:24:40, 0 +<== Total: 1 +Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] +2026-06-11 14:19:33 - 转换题目内容失败 +com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "explanation" (class top.tqx.demo_1.dto.ExamGradeRequest$QuestionContent), not marked as ignorable (3 known properties: "stem", "data", "answer"]) + at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: top.tqx.demo_1.dto.ExamGradeRequest$QuestionContent["explanation"]) + at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61) + at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:1138) + at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:2224) + at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1719) + at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1697) + at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:320) + at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177) + at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323) + at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:4801) + at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2974) + at com.fasterxml.jackson.databind.ObjectMapper.treeToValue(ObjectMapper.java:3438) + at top.tqx.demo_1.service.impl.ExamServiceImpl.gradeAnswersForRecord(ExamServiceImpl.java:490) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) - at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) - at jdk.proxy2/jdk.proxy2.$Proxy161.update(Unknown Source) - at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) - at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) - at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:392) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) + at top.tqx.demo_1.service.impl.ExamServiceImpl$$SpringCGLIB$$0.gradeAnswersForRecord() + at top.tqx.demo_1.controller.ExamController.gradeAnswers(ExamController.java:330) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) - at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) - at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) - at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) - at jdk.proxy2/jdk.proxy2.$Proxy160.update(Unknown Source) - at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) - at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at top.tqx.demo_1.aspect.LogAspect.around(LogAspect.java:43) + at jdk.internal.reflect.GeneratedMethodAccessor191.invoke(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) + at java.base/java.lang.reflect.Method.invoke(Unknown Source) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:637) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:627) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) + at top.tqx.demo_1.controller.ExamController$$SpringCGLIB$$0.gradeAnswers() at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) - at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) - ... 102 common frames omitted -2026-06-10 13:44:41 - 响应 | 耗时: 2889ms + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:206) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Unknown Source) +2026-06-11 14:19:33 - 题目内容为空,已设置默认值: questionId=9d59e7c5-edfc-4517-9fb5-780b389b66fb +2026-06-11 14:19:33 - Service层:开始批改题目 +2026-06-11 14:19:33 - Service层参数详情: +2026-06-11 14:19:33 - - userId: 1 +2026-06-11 14:19:33 - - paperId: ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b +2026-06-11 14:19:33 - - sessionId: null +2026-06-11 14:19:33 - - answerType: formal_exam +2026-06-11 14:19:33 - - 答案数量: 2 +2026-06-11 14:19:33 - - AI服务地址: http://localhost:5001/exam/grade +2026-06-11 14:19:33 - Service层:准备发送请求到AI服务 +2026-06-11 14:19:33 - 请求体内容: {"request_id":null,"paper_id":"ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b","session_id":null,"record_id":"683de5c4-cce6-47b4-8518-a582dce02ca4","answer_type":"formal_exam","answers":[{"question_id":"ea6a7f44-9077-4f19-b10e-8239a5198f4d","question_type":"single_choice","question_content":{"stem":"","data":null,"answer":""},"student_answer":"B","max_score":2.00},{"question_id":"9d59e7c5-edfc-4517-9fb5-780b389b66fb","question_type":"single_choice","question_content":{"stem":"","data":null,"answer":""},"student_answer":"B","max_score":2.00}]} +2026-06-11 14:19:33 - 请求超时时间: 60000ms (60秒) +2026-06-11 14:19:33 - Service层:收到AI服务响应 +2026-06-11 14:19:33 - 响应原始内容: {"data":{"request_id":null,"results":[{"correct":false,"feedback":"\u6b63\u786e\u7b54\u6848: ","max_score":2.0,"question_id":"ea6a7f44-9077-4f19-b10e-8239a5198f4d","score":0},{"correct":false,"feedback":"\u6b63\u786e\u7b54\u6848: ","max_score":2.0,"question_id":"9d59e7c5-edfc-4517-9fb5-780b389b66fb","score":0}],"score_rate":0.0,"success":true,"total_max_score":4.0,"total_score":0},"message":"\u6279\u9605\u5b8c\u6210","status":"success","status_code":2021,"success":true} + +2026-06-11 14:19:33 - 开始解析 2 道题 +2026-06-11 14:19:33 - 第 1 题 resultNode 内容: {"correct":false,"feedback":"正确答案: ","max_score":2.0,"question_id":"ea6a7f44-9077-4f19-b10e-8239a5198f4d","score":0} +2026-06-11 14:19:33 - resultNode 字段: false, 正确答案: , 2.0, ea6a7f44-9077-4f19-b10e-8239a5198f4d, 0 +2026-06-11 14:19:33 - 读取到 question_id: ea6a7f44-9077-4f19-b10e-8239a5198f4d +2026-06-11 14:19:33 - 第 2 题 resultNode 内容: {"correct":false,"feedback":"正确答案: ","max_score":2.0,"question_id":"9d59e7c5-edfc-4517-9fb5-780b389b66fb","score":0} +2026-06-11 14:19:33 - resultNode 字段: false, 正确答案: , 2.0, 9d59e7c5-edfc-4517-9fb5-780b389b66fb, 0 +2026-06-11 14:19:33 - 读取到 question_id: 9d59e7c5-edfc-4517-9fb5-780b389b66fb +2026-06-11 14:19:33 - 从请求中补全 question_type: single_choice +2026-06-11 14:19:33 - 从请求中补全 question_type: single_choice +2026-06-11 14:19:33 - 处理第 1 题, 类型: single_choice, grading_status: null +2026-06-11 14:19:33 - 处理第 2 题, 类型: single_choice, grading_status: null +2026-06-11 14:19:33 - Service层:AI服务批改完成 +2026-06-11 14:19:33 - 批改结果: success=true, totalScore=0, totalMaxScore=4.0, scoreRate=0.0 +2026-06-11 14:19:33 - 各题目批改结果: +2026-06-11 14:19:33 - 题目1(ea6a7f44-9077-4f19-b10e-8239a5198f4d): correct=false, score=0/2.0, feedback=正确答案: +2026-06-11 14:19:33 - 题目2(9d59e7c5-edfc-4517-9fb5-780b389b66fb): correct=false, score=0/2.0, feedback=正确答案: +Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] from current transaction +==> Preparing: UPDATE exam_record SET record_id=?, paper_id=?, answer_type=?, user_id=?, status=?, total_score=?, submit_time=?, graded_time=?, time_spent=?, start_time=?, last_active_time=?, created_at=?, updated_at=? WHERE id=? +==> Parameters: 683de5c4-cce6-47b4-8518-a582dce02ca4(String), ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b(String), formal_exam(String), 1(Long), graded(String), 0(BigDecimal), 2026-06-11T14:19:33.301970170(LocalDateTime), 2026-06-11T14:19:33.301977884(LocalDateTime), 444(Integer), 2026-06-11T14:12:09(LocalDateTime), 2026-06-11T14:12:09(LocalDateTime), 2026-06-11T14:12:04(LocalDateTime), 2026-06-11T14:19:33.302076352(LocalDateTime), 263(Long) +<== Updates: 1 +Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] +Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] from current transaction +==> Preparing: INSERT INTO user_answer ( user_id, question_id, question_type, answer_type, paper_id, user_answer, score, max_score, is_correct, grading_type, feedback, created_at, updated_at ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) +==> Parameters: 1(Long), ea6a7f44-9077-4f19-b10e-8239a5198f4d(String), single_choice(String), formal_exam(String), ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b(String), "B"(String), 0(BigDecimal), 2.0(BigDecimal), 0(Integer), ai(String), 正确答案: (String), 2026-06-11T14:19:33.309541700(LocalDateTime), 2026-06-11T14:19:33.309554819(LocalDateTime) +<== Updates: 1 +Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] +Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] from current transaction +==> Preparing: INSERT INTO user_answer ( user_id, question_id, question_type, answer_type, paper_id, user_answer, score, max_score, is_correct, grading_type, feedback, created_at, updated_at ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) +==> Parameters: 1(Long), 9d59e7c5-edfc-4517-9fb5-780b389b66fb(String), single_choice(String), formal_exam(String), ff10df62-4fd4-4bc4-8f8b-4dfb348aae8b(String), "B"(String), 0(BigDecimal), 2.0(BigDecimal), 0(Integer), ai(String), 正确答案: (String), 2026-06-11T14:19:33.315830690(LocalDateTime), 2026-06-11T14:19:33.315839473(LocalDateTime) +<== Updates: 1 +Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] +2026-06-11 14:19:33 - 保存了2条考试答题记录 +2026-06-11 14:19:33 - gradeAnswersForRecord 完成,总分: 0 +Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] +Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] +Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7777103a] +2026-06-11 14:19:33 - 正式考试批阅成功: recordId=683de5c4-cce6-47b4-8518-a582dce02ca4 +2026-06-11 14:19:33 - 响应 | 耗时: 103ms +g.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:206) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAd diff --git a/docs/sql/knowledge_management_system.sql b/docs/sql/knowledge_management_system.sql index 0eceff8..df1a73f 100644 --- a/docs/sql/knowledge_management_system.sql +++ b/docs/sql/knowledge_management_system.sql @@ -11,7 +11,7 @@ Target Server Version : 80046 (8.0.46-0ubuntu0.22.04.2) File Encoding : 65001 - Date: 10/06/2026 20:42:07 + Date: 11/06/2026 23:00:41 */ SET NAMES utf8mb4; @@ -43,7 +43,7 @@ CREATE TABLE `collection` ( INDEX `idx_department`(`department` ASC) USING BTREE, INDEX `idx_owner_type`(`owner_type` 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 @@ -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 (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 (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 @@ -72,16 +74,16 @@ CREATE TABLE `collection_file` ( INDEX `idx_doc_name`(`doc_name` 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 -) 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 -- ---------------------------- 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 (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 (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 @@ -320,12 +322,13 @@ CREATE TABLE `exam_assignment` ( 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_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 -- ---------------------------- -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 @@ -354,12 +357,13 @@ CREATE TABLE `exam_paper` ( INDEX `idx_status`(`status` 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 -) 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 -- ---------------------------- -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 @@ -392,14 +396,17 @@ CREATE TABLE `exam_record` ( 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_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 -- ---------------------------- -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 (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 (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 (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 (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 (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 @@ -516,20 +523,23 @@ CREATE TABLE `file` ( INDEX `idx_file_category`(`file_category` ASC) USING BTREE, INDEX `idx_audit_status`(`audit_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 -- ---------------------------- 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 (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 (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 (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-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-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}\"', '生成失败[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}\"', '{}'); 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 (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 (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}\"', 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 @@ -675,7 +685,7 @@ CREATE TABLE `question` ( INDEX `idx_created_at`(`created_at` ASC) USING BTREE, INDEX `idx_knowledge_base_path`(`knowledge_base_path` 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 @@ -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 (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 (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 @@ -947,29 +982,21 @@ CREATE TABLE `user_answer` ( 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_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 -- ---------------------------- -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 (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 (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 (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 (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 (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 (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 (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 (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 (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 (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'); +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 (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 (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 (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 (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 (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 (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 (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 (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 (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'); -- ---------------------------- -- Table structure for user_role diff --git a/docs/sql/migration_20260608_add_exclude_stems_and_is_deleted.sql b/docs/sql/migration_20260608_add_exclude_stems_and_is_deleted.sql deleted file mode 100644 index fffcf2d..0000000 --- a/docs/sql/migration_20260608_add_exclude_stems_and_is_deleted.sql +++ /dev/null @@ -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`; diff --git a/git.md b/git.md index 2b4244e..f6f74fd 100644 --- a/git.md +++ b/git.md @@ -34,6 +34,7 @@ git add . # 记录新增/修改 git add -A # 记录所有新增/修改/删除 git commit -m "说明" # 提交本地 git push # 上传到仓库 +git push origin main -f # 强制上传到远程 git config --global credential.helper manager # 记住密码 ``` diff --git a/src/main/java/top/tqx/demo_1/dto/ExamGradeRequest.java b/src/main/java/top/tqx/demo_1/dto/ExamGradeRequest.java index d74a3df..4d776cf 100644 --- a/src/main/java/top/tqx/demo_1/dto/ExamGradeRequest.java +++ b/src/main/java/top/tqx/demo_1/dto/ExamGradeRequest.java @@ -1,6 +1,7 @@ package top.tqx.demo_1.dto; import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; @@ -63,6 +64,7 @@ public class ExamGradeRequest implements Serializable { } @Data + @JsonIgnoreProperties(ignoreUnknown = true) public static class QuestionContent implements Serializable { private static final long serialVersionUID = 1L;