From 5ddb7a6d93f953194316e4ef6c8d981f37ec3280 Mon Sep 17 00:00:00 2001 From: zhuyongxin Date: Tue, 23 Jun 2026 10:53:24 +0800 Subject: [PATCH] =?UTF-8?q?feat(phase1):=20=E5=AE=8C=E6=88=90=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E8=AE=BE=E6=96=BD=E6=90=AD=E5=BB=BA=E5=88=9D=E6=AD=A5?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 JPA/Flyway/Redis 依赖到 pom.xml - 创建 3 个 Flyway 迁移脚本(diagnosis_record/case_library/api_document) - 创建枚举类(FaultCategory/DiagnosisStatus/SourceType) - 配置 MySQL + Redis 连接(application.yml) 状态:数据库表脚本就绪,等待数据库创建后验证 --- pom.xml | 39 ++++++++ .../agent/domain/enums/DiagnosisStatus.java | 21 +++++ .../agent/domain/enums/FaultCategory.java | 25 +++++ .../agent/domain/enums/SourceType.java | 19 ++++ src/main/resources/application.yml | 93 +++++++++++++------ .../V001__create_diagnosis_record.sql | 56 +++++++++++ .../migration/V002__create_case_library.sql | 41 ++++++++ .../migration/V003__create_api_document.sql | 38 ++++++++ 8 files changed, 302 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/superbiz/agent/domain/enums/DiagnosisStatus.java create mode 100644 src/main/java/com/superbiz/agent/domain/enums/FaultCategory.java create mode 100644 src/main/java/com/superbiz/agent/domain/enums/SourceType.java create mode 100644 src/main/resources/db/migration/V001__create_diagnosis_record.sql create mode 100644 src/main/resources/db/migration/V002__create_case_library.sql create mode 100644 src/main/resources/db/migration/V003__create_api_document.sql diff --git a/pom.xml b/pom.xml index 6ee1dda..41eadfd 100644 --- a/pom.xml +++ b/pom.xml @@ -144,6 +144,45 @@ org.springframework.ai spring-ai-starter-mcp-client-webflux + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.mysql + mysql-connector-j + runtime + + + + + org.flywaydb + flyway-core + + + org.flywaydb + flyway-mysql + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + org.springframework.boot + spring-boot-starter-test + test + + + com.h2database + h2 + test + diff --git a/src/main/java/com/superbiz/agent/domain/enums/DiagnosisStatus.java b/src/main/java/com/superbiz/agent/domain/enums/DiagnosisStatus.java new file mode 100644 index 0000000..adcaf11 --- /dev/null +++ b/src/main/java/com/superbiz/agent/domain/enums/DiagnosisStatus.java @@ -0,0 +1,21 @@ +package com.superbiz.agent.domain.enums; + +/** + * 诊断状态枚举 + */ +public enum DiagnosisStatus { + PENDING("待处理"), + RUNNING("诊断中"), + SUCCESS("成功"), + FAILED("失败"); + + private final String description; + + DiagnosisStatus(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } +} diff --git a/src/main/java/com/superbiz/agent/domain/enums/FaultCategory.java b/src/main/java/com/superbiz/agent/domain/enums/FaultCategory.java new file mode 100644 index 0000000..8bde91f --- /dev/null +++ b/src/main/java/com/superbiz/agent/domain/enums/FaultCategory.java @@ -0,0 +1,25 @@ +package com.superbiz.agent.domain.enums; + +/** + * 故障类别枚举 + */ +public enum FaultCategory { + EXTERNAL_API("外部接口调用失败"), + INTERNAL_ERROR("系统内部错误"), + DATABASE("数据库问题"), + CACHE("缓存问题"), + NETWORK("网络问题"), + THREAD("线程问题"), + MEMORY("内存问题"), + CONFIG("配置问题"); + + private final String description; + + FaultCategory(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } +} diff --git a/src/main/java/com/superbiz/agent/domain/enums/SourceType.java b/src/main/java/com/superbiz/agent/domain/enums/SourceType.java new file mode 100644 index 0000000..eb7de75 --- /dev/null +++ b/src/main/java/com/superbiz/agent/domain/enums/SourceType.java @@ -0,0 +1,19 @@ +package com.superbiz.agent.domain.enums; + +/** + * 案例来源类型枚举 + */ +public enum SourceType { + AUTO("自动生成"), + MANUAL("人工录入"); + + private final String description; + + SourceType(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 1076922..89b4894 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -6,6 +6,69 @@ server: enabled: true force: true +# 数据库配置 +spring: + datasource: + url: jdbc:mysql://119.29.78.52:33306/superbiz_agent?useUnicode=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true + username: root + password: '!Fucker123..' + driver-class-name: com.mysql.cj.jdbc.Driver + + jpa: + hibernate: + ddl-auto: validate + show-sql: true + properties: + hibernate: + format_sql: true + dialect: org.hibernate.dialect.MySQL8Dialect + + flyway: + enabled: true + baseline-on-migrate: true + locations: classpath:db/migration + + data: + redis: + host: 119.29.78.52 + port: 6379 + password: '' + database: 0 + timeout: 3000ms + lettuce: + pool: + max-active: 8 + max-idle: 8 + min-idle: 0 + + # Spring AI Alibaba DashScope 配置 + ai: + dashscope: + api-key: ${DASHSCOPE_API_KEY:your-api-key-here} + chat: + options: + timeout: 180000 + retry: + max-attempts: 3 + backoff: + initial-interval: 2000 + multiplier: 2 + max-interval: 10000 + + # Spring AI MCP 客户端配置 + mcp: + client: + enabled: true + name: tencent-mcp-server + version: 1.0.0 + request-timeout: 60s + type: ASYNC + sse: + connections: + tencent-cls: + url: https://mcp-api.tencent-cloud.com + sse-endpoint: /sse/92XXXXXXXXb4 + file: upload: path: ./uploads @@ -19,36 +82,6 @@ milvus: database: default timeout: 10000 -# Spring AI Alibaba DashScope 配置 -spring: - ai: - dashscope: - api-key: ${DASHSCOPE_API_KEY:your-api-key-here} # 从环境变量读取或使用默认值 - chat: - options: - timeout: 180000 # 超时时间180秒(3分钟) - retry: - max-attempts: 3 # 最大重试次数 - backoff: - initial-interval: 2000 # 初始重试间隔2秒 - multiplier: 2 # 重试间隔倍数 - max-interval: 10000 # 最大重试间隔10秒 - - # Spring AI MCP 客户端配置 - # 如果使用mock数据,请注释这部分内容 - mcp: - client: - enabled: true - name: tencent-mcp-server - version: 1.0.0 - request-timeout: 60s - type: ASYNC - sse: - connections: - tencent-cls: - url: https://mcp-api.tencent-cloud.com - sse-endpoint: /sse/92XXXXXXXXb4 # 完整的SSE端点路径 - # 阿里云 DashScope Embedding API 配置 dashscope: api: diff --git a/src/main/resources/db/migration/V001__create_diagnosis_record.sql b/src/main/resources/db/migration/V001__create_diagnosis_record.sql new file mode 100644 index 0000000..20c1769 --- /dev/null +++ b/src/main/resources/db/migration/V001__create_diagnosis_record.sql @@ -0,0 +1,56 @@ +-- V001: 创建诊断记录表 +-- 核心业务表,存储每次诊断任务的完整记录 +-- 设计理念:兼容多种故障类型(外部接口、内部错误、数据库、缓存等) + +CREATE TABLE diagnosis_record ( + -- 主键 + id BIGINT PRIMARY KEY AUTO_INCREMENT, + diagnosis_id VARCHAR(64) UNIQUE NOT NULL COMMENT '诊断唯一ID(UUID)', + + -- 关联信息 + session_id VARCHAR(64) COMMENT '会话ID(关联Redis)', + business_id VARCHAR(128) COMMENT '业务标识(订单号/请求ID/线程ID/任务ID...)', + trace_id VARCHAR(64) COMMENT '链路追踪ID', + + -- 故障分类(泛化设计) + fault_category VARCHAR(32) COMMENT '故障类别(EXTERNAL_API/INTERNAL_ERROR/DATABASE/CACHE/NETWORK/THREAD/MEMORY/CONFIG)', + fault_source VARCHAR(128) COMMENT '故障源(省份/服务名/类名/数据库实例...)', + fault_target VARCHAR(256) COMMENT '故障目标(接口URL/方法名/SQL语句/缓存键...)', + + -- 错误信息(通用) + error_code VARCHAR(64) COMMENT '错误码(业务错误码/HTTP状态码/异常类名)', + error_message TEXT COMMENT '错误消息', + stack_trace TEXT COMMENT '堆栈信息(内部错误时记录)', + + -- 诊断结果 + problem_type VARCHAR(32) COMMENT '问题类型(参数/网络/权限/逻辑/空指针/死锁...)', + root_cause TEXT COMMENT '根因分析', + solution TEXT COMMENT '修复方案', + report_markdown TEXT COMMENT '完整诊断报告(Markdown格式)', + + -- 评估指标 + status VARCHAR(16) DEFAULT 'PENDING' COMMENT '诊断状态(PENDING/RUNNING/SUCCESS/FAILED)', + confidence INT COMMENT '诊断置信度(0-100)', + duration INT COMMENT '诊断耗时(毫秒)', + + -- 用户反馈 + feedback VARCHAR(16) COMMENT '用户反馈(useful/not_useful/null)', + + -- 调试字段 + tool_calls JSON COMMENT '工具调用记录', + + -- 元数据 + created_by VARCHAR(64) COMMENT '创建人', + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + + -- 索引 + INDEX idx_business_id (business_id), + INDEX idx_trace_id (trace_id), + INDEX idx_session_id (session_id), + INDEX idx_fault_category (fault_category), + INDEX idx_fault_source_target (fault_source, fault_target(100)), + INDEX idx_error_code (error_code), + INDEX idx_created_at (created_at), + INDEX idx_status (status) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='诊断记录表(v2.0 泛化版)'; diff --git a/src/main/resources/db/migration/V002__create_case_library.sql b/src/main/resources/db/migration/V002__create_case_library.sql new file mode 100644 index 0000000..49876ad --- /dev/null +++ b/src/main/resources/db/migration/V002__create_case_library.sql @@ -0,0 +1,41 @@ +-- V002: 创建案例库表 +-- 知识沉淀表,存储高质量诊断案例,支持相似案例推荐 +-- 设计理念:质量过滤,只存储成功诊断 + 用户反馈有用的案例 + +CREATE TABLE case_library ( + -- 主键 + id BIGINT PRIMARY KEY AUTO_INCREMENT, + case_id VARCHAR(64) UNIQUE NOT NULL COMMENT '案例唯一ID(UUID)', + + -- 来源关联 + diagnosis_id VARCHAR(64) COMMENT '关联诊断记录(可选,人工录入时为空)', + source_type VARCHAR(16) DEFAULT 'AUTO' COMMENT '来源类型(AUTO:自动生成/MANUAL:人工录入)', + + -- 案例分类 + fault_category VARCHAR(32) COMMENT '故障类别(EXTERNAL_API/INTERNAL_ERROR/DATABASE...)', + fault_source VARCHAR(128) COMMENT '故障源(省份/服务名/类名...)', + fault_target VARCHAR(256) COMMENT '故障目标(接口URL/方法名/SQL...)', + error_code VARCHAR(64) COMMENT '错误码', + + -- 案例内容 + title VARCHAR(256) NOT NULL COMMENT '案例标题(简短描述)', + root_cause TEXT NOT NULL COMMENT '根因分析', + solution TEXT NOT NULL COMMENT '解决方案', + + -- 简单统计 + reference_count INT DEFAULT 0 COMMENT '引用次数(被推荐的次数)', + + -- 元数据 + created_by VARCHAR(64) COMMENT '创建人', + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + + -- 索引 + INDEX idx_fault_category (fault_category), + INDEX idx_error_code (error_code), + INDEX idx_fault_source (fault_source), + INDEX idx_fault_target (fault_target(100)), + INDEX idx_diagnosis_id (diagnosis_id), + INDEX idx_reference_count (reference_count), + INDEX idx_created_at (created_at) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='案例库表(MVP版)'; diff --git a/src/main/resources/db/migration/V003__create_api_document.sql b/src/main/resources/db/migration/V003__create_api_document.sql new file mode 100644 index 0000000..cbb5aa5 --- /dev/null +++ b/src/main/resources/db/migration/V003__create_api_document.sql @@ -0,0 +1,38 @@ +-- V003: 创建文档元数据表 +-- 文档管理表,管理接口文档的元信息 +-- 设计理念:MySQL 负责元数据管理,Milvus 负责内容检索,通过 doc_id 关联 + +CREATE TABLE api_document ( + -- 主键 + id BIGINT PRIMARY KEY AUTO_INCREMENT, + doc_id VARCHAR(64) UNIQUE NOT NULL COMMENT '文档唯一ID(UUID),关联Milvus', + + -- 文档分类 + fault_category VARCHAR(32) DEFAULT 'EXTERNAL_API' COMMENT '文档类别', + fault_source VARCHAR(128) COMMENT '文档归属(省份/服务名)', + api_name VARCHAR(128) COMMENT '接口名称', + version VARCHAR(32) DEFAULT 'v1.0' COMMENT '文档版本', + + -- 文件信息 + file_name VARCHAR(256) NOT NULL COMMENT '原始文件名', + file_path VARCHAR(512) COMMENT '文件存储路径', + file_hash VARCHAR(64) COMMENT '文件MD5 hash(用于去重)', + file_size BIGINT COMMENT '文件大小(字节)', + + -- 索引状态 + status VARCHAR(16) DEFAULT 'PENDING' COMMENT '索引状态(PENDING/PROCESSING/INDEXED/FAILED)', + chunk_count INT DEFAULT 0 COMMENT '分块数量', + error_message TEXT COMMENT '失败原因', + + -- 时间字段 + indexed_at DATETIME COMMENT '索引完成时间', + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + + -- 索引 + UNIQUE INDEX uk_file_hash (file_hash), + INDEX idx_doc_id (doc_id), + INDEX idx_fault_source (fault_source), + INDEX idx_status (status), + INDEX idx_created_at (created_at) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文档元数据表(MVP版)';