# ERP智能助手系统实施计划 (Phase 1) > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** 构建一个可以通过自然语言或结构化表单配置ERP功能的Web应用,实现需求解析、配置生成、审核确认、执行监控的完整流程。 **Architecture:** 单体内核架构,Python FastAPI后端 + Vue 3前端。后端集成Claude API和RAG知识库,通过SQL Server直连操作ERP配置表。采用TDD开发,事务保护机制确保安全。 **Tech Stack:** - 后端: FastAPI, SQLAlchemy, pyodbc, Claude API, ChromaDB, sentence-transformers - 前端: Vue 3, Vite, Element Plus, Monaco Editor, Axios, Pinia - 数据库: SQL Server, ChromaDB --- ## 文件结构规划 ### 后端文件职责划分 **配置层** - `backend/app/config.py` - 应用配置管理(数据库、Claude API、知识库路径等) **数据访问层** - `backend/app/core/db_engine.py` - 数据库连接池、事务管理、SQL执行 - `backend/app/models/request.py` - API请求模型(Pydantic) - `backend/app/models/response.py` - API响应模型 - `backend/app/models/database.py` - 数据库表模型(SQLAlchemy ORM,如果需要) **核心引擎层** - `backend/app/core/ai_engine.py` - Claude API客户端、Prompt模板、JSON解析 - `backend/app/core/rag_engine.py` - 知识库检索、文档向量化、元数据查询 - `backend/app/core/executor.py` - 配置执行器、事务编排、回滚机制 - `backend/app/core/validator.py` - SQL验证、风险检查、注入防护 **业务逻辑层** - `backend/app/services/requirement_service.py` - 需求解析服务(调用AI引擎) - `backend/app/services/config_service.py` - 配置生成服务 - `backend/app/services/execution_service.py` - 执行服务 **API层** - `backend/app/api/analyze.py` - 需求解析API - `backend/app/api/generate.py` - 配置生成API - `backend/app/api/execute.py` - 执行配置API - `backend/app/api/metadata.py` - 数据库元数据API - `backend/app/api/history.py` - 历史记录API **入口文件** - `backend/app/main.py` - FastAPI应用入口、中间件配置、路由注册 **工具脚本** - `backend/scripts/init_knowledge.py` - 初始化知识库 - `backend/scripts/import_docs.py` - 导入文档到知识库 **测试文件** - `backend/tests/test_db_engine.py` - 数据库引擎测试 - `backend/tests/test_ai_engine.py` - AI引擎测试 - `backend/tests/test_api.py` - API集成测试 ### 前端文件职责划分 **页面组件** - `frontend/src/views/CreateFunction.vue` - 新建功能主页面(包含步骤器) - `frontend/src/views/History.vue` - 历史记录页面 - `frontend/src/views/Settings.vue` - 系统设置页面 **可复用组件** - `frontend/src/components/RequirementInput.vue` - 需求输入组件(自然语言+结构化表单) - `frontend/src/components/ConfigPreview.vue` - 配置预览组件(SQL预览+风险提示) - `frontend/src/components/ExecutionMonitor.vue` - 执行监控组件(实时日志+进度条) **API调用** - `frontend/src/api/index.js` - Axios实例、API方法封装 **状态管理** - `frontend/src/store/index.js` - Pinia store(会话状态、执行状态) **路由配置** - `frontend/src/router/index.js` - Vue Router配置 --- ## 任务分解 ### 任务1: 项目初始化和配置管理 **Files:** - Create: `backend/requirements.txt` - Create: `backend/.env.example` - Create: `backend/app/config.py` - Create: `backend/app/__init__.py` - [ ] **Step 1: 创建requirements.txt** ```txt fastapi==0.104.1 uvicorn[standard]==0.24.0 sqlalchemy==2.0.23 pyodbc==5.0.1 anthropic==0.18.1 chromadb==0.4.18 sentence-transformers==2.2.2 pydantic==2.5.0 pydantic-settings==2.1.0 python-dotenv==1.0.0 loguru==0.7.2 tenacity==8.2.3 python-jose[cryptography]==3.3.0 pytest==7.4.3 pytest-asyncio==0.21.1 httpx==0.25.2 ``` - [ ] **Step 2: 创建.env.example** ```env APP_NAME=ERP AI Assistant APP_ENV=development DEBUG=True SECRET_KEY=change-this-in-production # Database DB_DRIVER=ODBC Driver 17 for SQL Server DB_SERVER=192.168.120.19 DB_PORT=1433 DB_NAME=DMPF_HY DB_USER=sa DB_PASSWORD=your-password # Claude API ANTHROPIC_API_KEY=your-claude-api-key CLAUDE_MODEL=claude-sonnet-4-6 CLAUDE_MAX_TOKENS=8192 CLAUDE_TEMPERATURE=0.7 # Knowledge Base KNOWLEDGE_BASE_PATH=./knowledge_base CHROMA_DB_PATH=./knowledge_base/chroma_db EMBEDDING_MODEL=all-MiniLM-L6-v2 CHUNK_SIZE=500 CHUNK_OVERLAP=50 ``` - [ ] **Step 3: 创建配置管理类** 创建 `backend/app/config.py`: ```python from pydantic_settings import BaseSettings from functools import lru_cache class Settings(BaseSettings): # Application APP_NAME: str = "ERP AI Assistant" APP_ENV: str = "development" DEBUG: bool = True SECRET_KEY: str # Database DB_DRIVER: str DB_SERVER: str DB_PORT: int = 1433 DB_NAME: str DB_USER: str DB_PASSWORD: str # Claude API ANTHROPIC_API_KEY: str CLAUDE_MODEL: str = "claude-sonnet-4-6" CLAUDE_MAX_TOKENS: int = 8192 CLAUDE_TEMPERATURE: float = 0.7 # Knowledge Base KNOWLEDGE_BASE_PATH: str = "./knowledge_base" CHROMA_DB_PATH: str = "./knowledge_base/chroma_db" EMBEDDING_MODEL: str = "all-MiniLM-L6-v2" CHUNK_SIZE: int = 500 CHUNK_OVERLAP: int = 50 @property def DATABASE_URL(self) -> str: """构建数据库连接URL""" return ( f"mssql+pyodbc://{self.DB_USER}:{self.DB_PASSWORD}" f"@{self.DB_SERVER}:{self.DB_PORT}/{self.DB_NAME}" f"?driver={self.DB_DRIVER}" ) class Config: env_file = ".env" case_sensitive = True @lru_cache() def get_settings() -> Settings: """获取配置单例""" return Settings() ``` - [ ] **Step 4: 创建__init__.py** 创建 `backend/app/__init__.py`: ```python """ERP AI Assistant Backend""" __version__ = "1.0.0" ``` - [ ] **Step 5: 安装依赖并验证配置** ```bash cd backend python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate pip install -r requirements.txt ``` 验证: ```bash python -c "from app.config import get_settings; s = get_settings(); print(s.APP_NAME)" ``` Expected: 输出配置的APP_NAME或报错缺少必需的环境变量 - [ ] **Step 6: Commit** ```bash git add backend/ git commit -m "chore: initialize project with config management" ``` --- ### 任务2: Pytest配置和测试基础设施 **Files:** - Create: `backend/pytest.ini` - Create: `backend/tests/conftest.py` - Update: `backend/requirements.txt` - [ ] **Step 1: 更新requirements.txt添加测试依赖** 在 `backend/requirements.txt` 末尾添加: ```txt pytest-cov==4.1.0 pytest-mock==3.12.0 ``` - [ ] **Step 2: 创建pytest.ini** 创建 `backend/pytest.ini`: ```ini [pytest] asyncio_mode = auto testpaths = tests python_files = test_*.py python_classes = Test* python_functions = test_* addopts = -v --cov=app --cov-report=term-missing ``` - [ ] **Step 3: 创建conftest.py** 创建 `backend/tests/conftest.py`: ```python import pytest from app.config import get_settings @pytest.fixture def test_settings(): """测试配置""" return get_settings() @pytest.fixture def mock_db_engine(mocker): """Mock数据库引擎""" from app.core.db_engine import DatabaseEngine return mocker.MagicMock(spec=DatabaseEngine) @pytest.fixture def mock_ai_engine(mocker): """Mock AI引擎""" from app.core.ai_engine import ClaudeEngine mock_engine = mocker.MagicMock(spec=ClaudeEngine) mock_engine.parse_json_response = lambda x: {"功能名称": "测试功能"} return mock_engine ``` - [ ] **Step 4: 验证pytest配置** ```bash cd backend pytest --version ``` Expected: 显示pytest版本信息 - [ ] **Step 5: Commit** ```bash git add backend/pytest.ini backend/tests/conftest.py backend/requirements.txt git commit -m "chore: add pytest configuration and test fixtures" ``` --- ### 任务3: 数据库引擎实现 **Files:** - Create: `backend/app/core/__init__.py` - Create: `backend/app/core/db_engine.py` - Create: `backend/tests/__init__.py` - Create: `backend/tests/test_db_engine.py` - [ ] **Step 1: 创建测试文件** 创建 `backend/tests/test_db_engine.py`: ```python import pytest from app.core.db_engine import DatabaseEngine def test_database_engine_init(): """测试数据库引擎初始化""" engine = DatabaseEngine() assert engine.engine is not None assert engine.Session is not None def test_execute_sql_select(): """测试执行SELECT查询""" engine = DatabaseEngine() result = engine.execute_sql("SELECT 1 AS test") assert result is not None assert len(result) > 0 def test_table_exists(): """测试表存在性检查""" engine = DatabaseEngine() # 假设SYS_FORM表存在 exists = engine.table_exists("SYS_FORM") assert exists is True ``` - [ ] **Step 2: 运行测试验证失败** ```bash cd backend pytest tests/test_db_engine.py -v ``` Expected: FAIL - 模块不存在 - [ ] **Step 3: 实现数据库引擎** 创建 `backend/app/core/db_engine.py`: ```python from sqlalchemy import create_engine, text from sqlalchemy.orm import sessionmaker from contextlib import contextmanager from loguru import logger from app.config import get_settings class DatabaseEngine: """数据库操作引擎""" def __init__(self): settings = get_settings() self.engine = create_engine( settings.DATABASE_URL, pool_size=20, max_overflow=10, pool_pre_ping=True, echo=settings.DEBUG ) self.Session = sessionmaker(bind=self.engine) @contextmanager def get_session(self): """获取数据库会话(上下文管理器)""" session = self.Session() try: yield session session.commit() except Exception as e: session.rollback() logger.error(f"数据库操作失败: {e}") raise finally: session.close() def execute_sql(self, sql: str, params: dict = None): """执行单条SQL""" with self.get_session() as session: result = session.execute(text(sql), params or {}) return result.fetchall() def execute_transaction(self, sql_list: list, params_list: list = None): """执行事务(多条SQL)""" params_list = params_list or [None] * len(sql_list) with self.get_session() as session: for sql, params in zip(sql_list, params_list): session.execute(text(sql), params or {}) return True def get_table_structure(self, table_name: str): """获取表结构""" sql = f""" SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{table_name}' ORDER BY ORDINAL_POSITION """ return self.execute_sql(sql) def table_exists(self, table_name: str) -> bool: """检查表是否存在""" sql = f""" SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{table_name}' """ result = self.execute_sql(sql) return result[0][0] > 0 ``` - [ ] **Step 4: 运行测试验证通过** ```bash cd backend pytest tests/test_db_engine.py -v ``` Expected: PASS - 所有测试通过 - [ ] **Step 5: Commit** ```bash git add backend/app/core/ backend/tests/ git commit -m "feat: implement database engine with connection pooling" ``` --- ### 任务3: AI引擎基础实现 **Files:** - Create: `backend/app/core/ai_engine.py` - Create: `backend/tests/test_ai_engine.py` - [ ] **Step 1: 创建AI引擎测试** 创建 `backend/tests/test_ai_engine.py`: ```python import pytest from app.core.ai_engine import ClaudeEngine def test_claude_engine_init(): """测试Claude引擎初始化""" engine = ClaudeEngine() assert engine.client is not None assert engine.model == "claude-sonnet-4-6" def test_parse_json_response(): """测试JSON解析""" engine = ClaudeEngine() # 测试纯JSON json_str = '{"name": "test", "value": 123}' result = engine.parse_json_response(json_str) assert result["name"] == "test" assert result["value"] == 123 # 测试markdown代码块 md_str = '```json\n{"name": "test"}\n```' result = engine.parse_json_response(md_str) assert result["name"] == "test" ``` - [ ] **Step 2: 运行测试验证失败** ```bash pytest tests/test_ai_engine.py -v ``` Expected: FAIL - 模块不存在 - [ ] **Step 3: 实现AI引擎基础** 创建 `backend/app/core/ai_engine.py`: ```python import anthropic import json import re from loguru import logger from app.config import get_settings class ClaudeEngine: """Claude API调用引擎""" def __init__(self): settings = get_settings() self.client = anthropic.Anthropic(api_key=settings.ANTHROPIC_API_KEY) self.model = settings.CLAUDE_MODEL self.max_tokens = settings.CLAUDE_MAX_TOKENS self.temperature = settings.CLAUDE_TEMPERATURE def parse_json_response(self, content: str) -> dict: """解析Claude返回的JSON""" # 尝试直接解析 try: return json.loads(content) except json.JSONDecodeError: pass # 尝试提取```json```块 json_match = re.search(r'```json\s*(.*?)\s*```', content, re.DOTALL) if json_match: try: return json.loads(json_match.group(1)) except json.JSONDecodeError: pass # 尝试提取{}块 json_match = re.search(r'\{.*\}', content, re.DOTALL) if json_match: try: return json.loads(json_match.group(0)) except json.JSONDecodeError: pass raise ValueError(f"无法解析Claude返回的JSON: {content[:100]}") async def call_claude(self, messages: list, temperature: float = None) -> str: """调用Claude API""" try: response = self.client.messages.create( model=self.model, max_tokens=self.max_tokens, temperature=temperature or self.temperature, messages=messages ) return response.content[0].text except Exception as e: logger.error(f"Claude API调用失败: {e}") raise ``` - [ ] **Step 4: 运行测试验证通过** ```bash pytest tests/test_ai_engine.py -v ``` Expected: PASS - [ ] **Step 5: Commit** ```bash git add backend/app/core/ai_engine.py backend/tests/test_ai_engine.py git commit -m "feat: implement Claude API engine with JSON parsing" ``` --- ### 任务4: Prompt模板设计 **Files:** - Create: `backend/app/core/prompts.py` - Create: `backend/tests/test_prompts.py` - [ ] **Step 1: 创建Prompt测试** 创建 `backend/tests/test_prompts.py`: ```python from app.core.prompts import SYSTEM_PROMPT, ANALYZE_PROMPT_TEMPLATE def test_system_prompt_exists(): """测试系统Prompt存在""" assert SYSTEM_PROMPT is not None assert len(SYSTEM_PROMPT) > 100 assert "ERP平台配置专家" in SYSTEM_PROMPT def test_analyze_prompt_template(): """测试需求解析模板""" rendered = ANALYZE_PROMPT_TEMPLATE.format( user_input="创建销售订单", knowledge_context="测试知识", existing_tables="测试表" ) assert "创建销售订单" in rendered assert "测试知识" in rendered ``` - [ ] **Step 2: 运行测试验证失败** ```bash pytest tests/test_prompts.py -v ``` Expected: FAIL - [ ] **Step 3: 实现Prompt模板** 创建 `backend/app/core/prompts.py`: ```python """Prompt模板定义""" SYSTEM_PROMPT = """你是一个ERP平台配置专家助手,专门帮助开发人员配置一零软件结构化开发平台。 你的职责: 1. 理解用户的功能需求 2. 设计合理的数据库表结构 3. 生成符合平台规范的配置方案 4. 提供最佳实践建议 平台核心知识: - 窗体类型:0-普通、3-单树、4-树表、5-单据列表、11-一对多等 - 标准字段:IKEY(主键)、COMPANYID、DOCCODE、DOCDATE、DOCSTATUS等 - 配置流程:建表 → 配置功能号 → 配置页面 → 配置菜单 → 配置IKEY - 命名规范:SA_销售、PU_采购、ST_库存、FI_财务 输出要求: - 必须提供完整的SQL脚本 - 必须遵循平台配置规范 - 必须包含风险评估 - 使用JSON格式输出 """ ANALYZE_PROMPT_TEMPLATE = """用户需求:{user_input} 参考知识: {knowledge_context} 现有相关表: {existing_tables} 请分析用户需求,输出结构化需求文档(JSON格式): {{ "功能名称": "xxx", "功能号建议": "xx-xxx", "窗体类型": "x", "主表名建议": "XX_XXX", "从表名建议": "XX_XXX_DETAIL", "主表字段": [ {{ "字段名": "xxx", "字段类型": "xxx", "必填": true, "默认值": "xxx", "说明": "xxx" }} ], "从表字段": [], "业务需求": [], "关联表": [], "风险提示": [] }} """ GENERATE_PROMPT_TEMPLATE = """结构化需求: {requirements} 平台配置规范: {platform_rules} 相似案例: {similar_cases} 请生成完整的配置方案,包括: 1. 建表SQL(主表、从表、日志表) 2. 功能号配置SQL 3. 页面配置SQL 4. 菜单配置SQL 5. IKEY配置SQL 输出JSON格式: {{ "配置方案": {{ "建表SQL": [ {{ "表名": "SA_ORDER", "类型": "主表", "SQL": "CREATE TABLE SA_ORDER (...)", "说明": "销售订单主表" }} ], "配置SQL": [ {{ "类型": "功能号配置", "SQL": "INSERT INTO SYS_FORM (...)", "说明": "配置功能号11-001" }} ] }}, "风险评估": [], "建议后续操作": [] }} """ ``` - [ ] **Step 4: 运行测试验证通过** ```bash pytest tests/test_prompts.py -v ``` Expected: PASS - [ ] **Step 5: Commit** ```bash git add backend/app/core/prompts.py backend/tests/test_prompts.py git commit -m "feat: add prompt templates for requirement analysis and config generation" ``` --- ### 任务5: 知识库引擎基础实现 **Files:** - Create: `backend/app/core/rag_engine.py` - Create: `backend/knowledge_base/documents/.gitkeep` - Create: `backend/scripts/init_knowledge.py` - [ ] **Step 1: 创建知识库目录结构** ```bash mkdir -p backend/knowledge_base/documents touch backend/knowledge_base/documents/.gitkeep ``` - [ ] **Step 2: 实现RAG引擎基础** 创建 `backend/app/core/rag_engine.py`: ```python import chromadb from chromadb.config import Settings as ChromaSettings from sentence_transformers import SentenceTransformer from loguru import logger from app.config import get_settings class RAGEngine: """RAG检索引擎""" def __init__(self): settings = get_settings() # 初始化向量数据库 self.chroma_client = chromadb.PersistentClient( path=settings.CHROMA_DB_PATH, settings=ChromaSettings(anonymized_telemetry=False) ) # 初始化嵌入模型 logger.info(f"加载嵌入模型: {settings.EMBEDDING_MODEL}") self.embedding_model = SentenceTransformer(settings.EMBEDDING_MODEL) # 获取或创建集合 self.documents_collection = self.chroma_client.get_or_create_collection( name="documents" ) self.chunk_size = settings.CHUNK_SIZE self.chunk_overlap = settings.CHUNK_OVERLAP def add_document(self, doc_id: str, content: str, metadata: dict = None): """添加文档到知识库""" # 分块 chunks = self._split_text(content) # 生成嵌入 embeddings = self.embedding_model.encode(chunks) # 添加到向量库 ids = [f"{doc_id}_chunk_{i}" for i in range(len(chunks))] metadatas = [metadata or {} for _ in chunks] self.documents_collection.add( ids=ids, documents=chunks, embeddings=embeddings.tolist(), metadatas=metadatas ) logger.info(f"添加文档 {doc_id},共 {len(chunks)} 个块") return len(chunks) def search(self, query: str, top_k: int = 3) -> list: """检索相关文档""" # 生成查询向量 query_embedding = self.embedding_model.encode([query]) # 检索 results = self.documents_collection.query( query_embeddings=query_embedding.tolist(), n_results=top_k ) return [ { "content": doc, "metadata": meta, "distance": dist } for doc, meta, dist in zip( results["documents"][0], results["metadatas"][0], results["distances"][0] ) ] def _split_text(self, text: str) -> list: """文本分块""" chunks = [] start = 0 while start < len(text): end = start + self.chunk_size chunk = text[start:end] chunks.append(chunk) start += self.chunk_size - self.chunk_overlap return chunks ``` - [ ] **Step 3: 创建知识库初始化脚本** 创建 `backend/scripts/init_knowledge.py`: ```python #!/usr/bin/env python3 """初始化知识库""" import sys import os # 添加项目根目录到路径 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from app.core.rag_engine import RAGEngine from loguru import logger def init_knowledge_base(): """初始化知识库""" logger.info("开始初始化知识库...") rag = RAGEngine() # 示例:添加平台基础知识 sample_doc = """ 一零软件结构化开发平台配置指南 窗体类型: - 0: 普通类型 - 3: 单树类型 - 4: 树表类型 - 5: 单据列表类型 - 11: 一对多的窗体类型 标准字段: 每张表都必须包含以下字段: - IKEY: 主键,自增 - COMPANYID: 公司代码 - CREATE_USER: 创建人 - CREATE_DATE: 创建时间 - UPDATE_USER: 更新人 - UPDATE_DATE: 更新时间 单据类型额外字段: - DOCCODE: 单据号 - DOCDATE: 单据日期 - DOCSTATUS: 单据状态 配置流程: 1. 在99-001创建功能号 2. 在99-003配置页面 3. 在99-002配置菜单 4. 在99-006配置IKEY """ rag.add_document( doc_id="platform_basics", content=sample_doc, metadata={"source": "platform_intro", "type": "guide"} ) logger.success("知识库初始化完成!") if __name__ == "__main__": init_knowledge_base() ``` - [ ] **Step 4: 测试知识库初始化** ```bash cd backend python scripts/init_knowledge.py ``` Expected: 成功初始化并输出日志 - [ ] **Step 5: Commit** ```bash git add backend/app/core/rag_engine.py backend/scripts/ backend/knowledge_base/ git commit -m "feat: implement RAG engine with ChromaDB and sentence-transformers" ``` --- ### 任务6: 需求解析服务实现 **Files:** - Create: `backend/app/services/__init__.py` - Create: `backend/app/services/requirement_service.py` - Create: `backend/tests/test_requirement_service.py` - [ ] **Step 1: 创建需求解析服务测试** 创建 `backend/tests/test_requirement_service.py`: ```python import pytest from app.services.requirement_service import RequirementService @pytest.mark.asyncio async def test_analyze_requirement(): """测试需求解析""" service = RequirementService() result = await service.analyze( user_input="创建一个销售订单管理页面", session_id="test-session" ) assert result is not None assert "功能名称" in result assert result["功能名称"] != "" ``` - [ ] **Step 2: 运行测试验证失败** ```bash pytest tests/test_requirement_service.py -v ``` Expected: FAIL - [ ] **Step 3: 实现需求解析服务** 创建 `backend/app/services/requirement_service.py`: ```python from app.core.ai_engine import ClaudeEngine from app.core.rag_engine import RAGEngine from app.core.prompts import SYSTEM_PROMPT, ANALYZE_PROMPT_TEMPLATE from app.core.db_engine import DatabaseEngine from loguru import logger import uuid class RequirementService: """需求解析服务""" def __init__(self): self.ai_engine = ClaudeEngine() self.rag_engine = RAGEngine() self.db_engine = DatabaseEngine() async def analyze(self, user_input: str, session_id: str = None) -> dict: """分析用户需求 Args: user_input: 用户输入的自然语言需求 session_id: 会话ID(用于上下文管理) Returns: 结构化需求文档 """ session_id = session_id or str(uuid.uuid4()) logger.info(f"开始分析需求: {user_input[:50]}...") # 1. 检索相关知识 knowledge_results = self.rag_engine.search(user_input, top_k=3) knowledge_context = "\n\n".join([ f"【{r['metadata'].get('source', '文档')}】\n{r['content']}" for r in knowledge_results ]) # 2. 查询现有相关表 existing_tables = self._get_existing_tables(user_input) # 3. 构建Prompt prompt = ANALYZE_PROMPT_TEMPLATE.format( user_input=user_input, knowledge_context=knowledge_context, existing_tables=existing_tables ) messages = [ {"role": "user", "content": SYSTEM_PROMPT}, {"role": "assistant", "content": "我已了解平台配置规范,请告诉我您的需求。"}, {"role": "user", "content": prompt} ] # 4. 调用Claude API response = await self.ai_engine.call_claude(messages, temperature=0.7) # 5. 解析结果 result = self.ai_engine.parse_json_response(response) logger.success(f"需求分析完成: {result.get('功能名称', 'Unknown')}") return result def _get_existing_tables(self, user_input: str) -> str: """查询现有相关表""" # 简化版本:查询所有表 try: sql = """ SELECT TOP 10 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_NAME """ tables = self.db_engine.execute_sql(sql) return "\n".join([f"- {t[0]}" for t in tables]) except Exception as e: logger.warning(f"查询现有表失败: {e}") return "无法获取现有表信息" ``` - [ ] **Step 4: 运行测试验证通过** ```bash pytest tests/test_requirement_service.py -v ``` Expected: PASS(需要配置Claude API Key) - [ ] **Step 5: Commit** ```bash git add backend/app/services/ backend/tests/test_requirement_service.py git commit -m "feat: implement requirement analysis service with Claude API" ``` --- ### 任务7: 执行引擎实现 **Files:** - Create: `backend/app/core/executor.py` - Create: `backend/tests/test_executor.py` - [ ] **Step 1: 创建执行引擎测试** 创建 `backend/tests/test_executor.py`: ```python import pytest from app.core.executor import ConfigExecutor def test_executor_init(): """测试执行器初始化""" executor = ConfigExecutor() assert executor.db_engine is not None def test_validate_sql(): """测试SQL验证""" executor = ConfigExecutor() # 测试合法SQL is_valid, msg = executor.validate_sql("SELECT * FROM SYS_FORM") assert is_valid is True # 测试危险SQL is_valid, msg = executor.validate_sql("DROP DATABASE test") assert is_valid is False assert "危险操作" in msg ``` - [ ] **Step 2: 运行测试验证失败** ```bash pytest tests/test_executor.py -v ``` Expected: FAIL - [ ] **Step 3: 实现执行引擎** 创建 `backend/app/core/executor.py`: ```python import re from typing import List, Tuple from loguru import logger from app.core.db_engine import DatabaseEngine class ConfigExecutor: """配置执行器""" # 危险SQL关键词 DANGEROUS_KEYWORDS = [ "DROP DATABASE", "DROP TABLE", "TRUNCATE TABLE", "DELETE FROM", "UPDATE.*SET", "ALTER TABLE.*DROP" ] def __init__(self): self.db_engine = DatabaseEngine() def validate_sql(self, sql: str) -> Tuple[bool, str]: """验证SQL安全性 Returns: (is_valid, message) """ sql_upper = sql.upper() # 检查危险操作 for keyword in self.DANGEROUS_KEYWORDS: if re.search(keyword, sql_upper): return False, f"危险操作被拦截: {keyword}" return True, "SQL验证通过" def execute_config(self, sql_list: List[str], session_id: str) -> dict: """执行配置SQL列表 Args: sql_list: SQL列表 session_id: 会话ID Returns: 执行结果 """ logger.info(f"开始执行配置,共 {len(sql_list)} 条SQL") results = { "success": True, "executed": [], "failed": None, "message": "" } try: # 验证所有SQL for i, sql in enumerate(sql_list): is_valid, msg = self.validate_sql(sql) if not is_valid: raise ValueError(f"SQL #{i+1} 验证失败: {msg}") # 执行事务 self.db_engine.execute_transaction(sql_list) results["executed"] = sql_list results["message"] = f"成功执行 {len(sql_list)} 条SQL" logger.success(results["message"]) except Exception as e: results["success"] = False results["failed"] = str(e) results["message"] = f"执行失败: {e}" logger.error(results["message"]) return results def rollback(self, session_id: str): """回滚操作(占位符,实际需要记录逆向SQL)""" logger.warning(f"回滚功能待实现: {session_id}") return {"success": False, "message": "回滚功能待实现"} ``` - [ ] **Step 4: 运行测试验证通过** ```bash pytest tests/test_executor.py -v ``` Expected: PASS - [ ] **Step 5: Commit** ```bash git add backend/app/core/executor.py backend/tests/test_executor.py git commit -m "feat: implement config executor with SQL validation" ``` --- ### 任务8: API层实现 - 基础结构 **Files:** - Create: `backend/app/models/__init__.py` - Create: `backend/app/models/request.py` - Create: `backend/app/models/response.py` - Create: `backend/app/api/__init__.py` - Create: `backend/app/main.py` - [ ] **Step 1: 创建请求/响应模型** 创建 `backend/app/models/request.py`: ```python from pydantic import BaseModel, Field from typing import Optional, List class AnalyzeRequest(BaseModel): """需求解析请求""" input_type: str = Field(..., description="输入类型: natural_language | structured") content: str = Field(..., description="需求内容") session_id: Optional[str] = Field(None, description="会话ID") class GenerateRequest(BaseModel): """配置生成请求""" session_id: str requirements: dict class ExecuteRequest(BaseModel): """执行配置请求""" session_id: str confirmed: bool = Field(False, description="用户确认标识") backup_enabled: bool = Field(True, description="是否启用备份") ``` 创建 `backend/app/models/response.py`: ```python from pydantic import BaseModel from typing import Optional, Any, List class AnalyzeResponse(BaseModel): """需求解析响应""" session_id: str status: str data: dict class GenerateResponse(BaseModel): """配置生成响应""" session_id: str status: str data: dict class ExecuteResponse(BaseModel): """执行配置响应""" execution_id: str status: str message: str class ErrorResponse(BaseModel): """错误响应""" error: dict ``` - [ ] **Step 2: 创建FastAPI主应用** 创建 `backend/app/main.py`: ```python from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app.config import get_settings settings = get_settings() app = FastAPI( title=settings.APP_NAME, version="1.0.0", debug=settings.DEBUG ) # CORS配置 app.add_middleware( CORSMiddleware, allow_origins=["http://localhost:5173"], # Vue开发服务器 allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.get("/") async def root(): """根路径""" return { "message": settings.APP_NAME, "version": "1.0.0", "status": "running" } @app.get("/health") async def health_check(): """健康检查""" return {"status": "healthy"} if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000) ``` - [ ] **Step 3: 启动服务验证** ```bash cd backend python -m app.main ``` 访问 http://localhost:8000 验证返回JSON - [ ] **Step 4: Commit** ```bash git add backend/app/models/ backend/app/api/ backend/app/main.py git commit -m "feat: create FastAPI application with request/response models" ``` --- ### 任务9: API层实现 - 需求解析API **Files:** - Create: `backend/app/api/analyze.py` - Update: `backend/app/main.py` - [ ] **Step 1: 创建需求解析API** 创建 `backend/app/api/analyze.py`: ```python from fastapi import APIRouter, HTTPException from app.models.request import AnalyzeRequest from app.models.response import AnalyzeResponse from app.services.requirement_service import RequirementService import uuid router = APIRouter() @router.post("/analyze", response_model=AnalyzeResponse) async def analyze_requirement(request: AnalyzeRequest): """需求解析API""" try: service = RequirementService() session_id = request.session_id or str(uuid.uuid4()) result = await service.analyze( user_input=request.content, session_id=session_id ) return AnalyzeResponse( session_id=session_id, status="success", data=result ) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) ``` - [ ] **Step 2: 注册路由到main.py** 更新 `backend/app/main.py`: ```python from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app.config import get_settings from app.api import analyze # 添加导入 settings = get_settings() app = FastAPI( title=settings.APP_NAME, version="1.0.0", debug=settings.DEBUG ) # CORS配置 app.add_middleware( CORSMiddleware, allow_origins=["http://localhost:5173"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 注册路由 app.include_router(analyze.router, prefix="/api/v1", tags=["分析"]) @app.get("/") async def root(): return { "message": settings.APP_NAME, "version": "1.0.0", "status": "running" } @app.get("/health") async def health_check(): return {"status": "healthy"} if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000) ``` - [ ] **Step 3: 测试API** ```bash curl -X POST http://localhost:8000/api/v1/analyze \ -H "Content-Type: application/json" \ -d '{"input_type": "natural_language", "content": "创建销售订单管理页面"}' ``` Expected: 返回JSON响应 - [ ] **Step 4: Commit** ```bash git add backend/app/api/analyze.py backend/app/main.py git commit -m "feat: implement analyze API endpoint" ``` --- ### 任务10: 前端项目初始化 **Files:** - Create: `frontend/package.json` - Create: `frontend/vite.config.js` - Create: `frontend/index.html` - Create: `frontend/src/main.js` - Create: `frontend/src/App.vue` - [ ] **Step 1: 初始化Vue项目** ```bash cd frontend npm create vite@latest . -- --template vue npm install npm install vue-router@4 pinia axios element-plus monaco-editor sql-formatter ``` - [ ] **Step 2: 配置vite.config.js** ```javascript import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [vue()], server: { port: 5173, proxy: { '/api': { target: 'http://localhost:8000', changeOrigin: true } } } }) ``` - [ ] **Step 3: 创建基础App.vue** ```vue ``` - [ ] **Step 4: 启动前端验证** ```bash npm run dev ``` 访问 http://localhost:5173 验证Vue应用运行 - [ ] **Step 5: Commit** ```bash git add frontend/ git commit -m "chore: initialize Vue 3 frontend with Vite" ``` --- ### 任务11: 前端路由和布局 **Files:** - Create: `frontend/src/router/index.js` - Create: `frontend/src/views/Layout.vue` - Update: `frontend/src/main.js` - [ ] **Step 1: 创建路由配置** 创建 `frontend/src/router/index.js`: ```javascript import { createRouter, createWebHistory } from 'vue-router' const routes = [ { path: '/', component: () => import('../views/Layout.vue'), children: [ { path: '', redirect: '/create' }, { path: 'create', name: 'CreateFunction', component: () => import('../views/CreateFunction.vue') }, { path: 'history', name: 'History', component: () => import('../views/History.vue') } ] } ] const router = createRouter({ history: createWebHistory(), routes }) export default router ``` - [ ] **Step 2: 创建布局组件** 创建 `frontend/src/views/Layout.vue`: ```vue ``` - [ ] **Step 3: 更新main.js** ```javascript import { createApp } from 'vue' import { createPinia } from 'pinia' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' import App from './App.vue' import router from './router' const app = createApp(App) app.use(createPinia()) app.use(router) app.use(ElementPlus) app.mount('#app') ``` - [ ] **Step 4: 创建占位页面** 创建 `frontend/src/views/CreateFunction.vue`: ```vue ``` 创建 `frontend/src/views/History.vue`: ```vue ``` - [ ] **Step 5: 测试路由** 访问 http://localhost:5173 验证布局和路由切换 - [ ] **Step 6: Commit** ```bash git add frontend/src/ git commit -m "feat: add frontend layout and routing" ``` --- ### 任务12: 执行日志表和审计系统 **Files:** - Create: `backend/scripts/create_log_table.sql` - Create: `backend/app/models/audit.py` - Create: `backend/app/services/audit_service.py` - [ ] **Step 1: 创建执行日志表SQL脚本** 创建 `backend/scripts/create_log_table.sql`: ```sql -- AI助手执行日志表 CREATE TABLE AI_ASSISTANT_LOG ( LOG_ID INT IDENTITY(1,1) PRIMARY KEY, SESSION_ID VARCHAR(50) NOT NULL, EXECUTION_ID VARCHAR(50), USER_ID VARCHAR(50), ACTION_TYPE VARCHAR(50), SQL_CONTENT NVARCHAR(MAX), STATUS VARCHAR(20), ERROR_MESSAGE NVARCHAR(MAX), EXECUTION_TIME INT, CREATE_TIME DATETIME DEFAULT GETDATE(), INDEX IX_SESSION_ID (SESSION_ID), INDEX IX_CREATE_TIME (CREATE_TIME) ); -- 创建索引 CREATE INDEX IX_EXECUTION_ID ON AI_ASSISTANT_LOG(EXECUTION_ID); ``` - [ ] **Step 2: 执行SQL创建表** ```bash # 使用sqlcmd或数据库管理工具执行 sqlcmd -S 192.168.120.19 -d DMPF_HY -U sa -P your-password -i backend/scripts/create_log_table.sql ``` - [ ] **Step 3: 创建审计模型** 创建 `backend/app/models/audit.py`: ```python from pydantic import BaseModel from datetime import datetime from typing import Optional class ExecutionLog(BaseModel): """执行日志模型""" log_id: Optional[int] session_id: str execution_id: Optional[str] user_id: Optional[str] action_type: str sql_content: str status: str error_message: Optional[str] execution_time: Optional[int] create_time: Optional[datetime] = None ``` - [ ] **Step 4: 创建审计服务** 创建 `backend/app/services/audit_service.py`: ```python from app.core.db_engine import DatabaseEngine from app.models.audit import ExecutionLog from loguru import logger import uuid class AuditService: """审计服务""" def __init__(self): self.db_engine = DatabaseEngine() def log_execution(self, log: ExecutionLog) -> int: """记录执行日志""" sql = """ INSERT INTO AI_ASSISTANT_LOG (SESSION_ID, EXECUTION_ID, USER_ID, ACTION_TYPE, SQL_CONTENT, STATUS, ERROR_MESSAGE, EXECUTION_TIME) VALUES (:session_id, :execution_id, :user_id, :action_type, :sql_content, :status, :error_message, :execution_time) """ params = { "session_id": log.session_id, "execution_id": log.execution_id or str(uuid.uuid4()), "user_id": log.user_id or "system", "action_type": log.action_type, "sql_content": log.sql_content, "status": log.status, "error_message": log.error_message, "execution_time": log.execution_time } try: self.db_engine.execute_sql(sql, params) logger.info(f"记录执行日志: {log.action_type}") return 1 except Exception as e: logger.error(f"记录执行日志失败: {e}") return 0 def get_execution_history(self, session_id: str, limit: int = 100): """获取执行历史""" sql = f""" SELECT TOP {limit} * FROM AI_ASSISTANT_LOG WHERE SESSION_ID = '{session_id}' ORDER BY CREATE_TIME DESC """ return self.db_engine.execute_sql(sql) ``` - [ ] **Step 5: 编写测试** 创建 `backend/tests/test_audit_service.py`: ```python from app.services.audit_service import AuditService from app.models.audit import ExecutionLog def test_log_execution(): """测试执行日志记录""" service = AuditService() log = ExecutionLog( session_id="test-session", action_type="TEST", sql_content="SELECT 1", status="SUCCESS" ) result = service.log_execution(log) assert result == 1 ``` - [ ] **Step 6: 运行测试** ```bash pytest tests/test_audit_service.py -v ``` - [ ] **Step 7: Commit** ```bash git add backend/scripts/create_log_table.sql backend/app/models/audit.py backend/app/services/audit_service.py backend/tests/test_audit_service.py git commit -m "feat: add execution logging and audit system" ``` --- ### 任务13: 配置生成服务 **Files:** - Create: `backend/app/services/config_service.py` - Create: `backend/tests/test_config_service.py` - [ ] **Step 1: 创建配置生成服务测试** 创建 `backend/tests/test_config_service.py`: ```python import pytest from app.services.config_service import ConfigService @pytest.mark.asyncio async def test_generate_config(): """测试配置生成""" service = ConfigService() requirements = { "功能名称": "销售订单", "功能号建议": "11-001", "窗体类型": "5", "主表名建议": "SA_ORDER", "主表字段": [ {"字段名": "订单号", "字段类型": "varchar(50)", "必填": True} ] } result = await service.generate(requirements, "test-session") assert result is not None assert "配置方案" in result ``` - [ ] **Step 2: 运行测试验证失败** ```bash pytest tests/test_config_service.py -v ``` Expected: FAIL - [ ] **Step 3: 实现配置生成服务** 创建 `backend/app/services/config_service.py`: ```python from app.core.ai_engine import ClaudeEngine from app.core.rag_engine import RAGEngine from app.core.prompts import SYSTEM_PROMPT, GENERATE_PROMPT_TEMPLATE from app.core.db_engine import DatabaseEngine from loguru import logger class ConfigService: """配置生成服务""" def __init__(self): self.ai_engine = ClaudeEngine() self.rag_engine = RAGEngine() self.db_engine = DatabaseEngine() async def generate(self, requirements: dict, session_id: str) -> dict: """生成配置方案 Args: requirements: 结构化需求 session_id: 会话ID Returns: 配置方案(包含SQL列表) """ logger.info(f"开始生成配置: {requirements.get('功能名称', 'Unknown')}") # 1. 检索相关知识 platform_rules = self._get_platform_rules(requirements.get("窗体类型", "0")) similar_cases = self._get_similar_cases(requirements.get("功能名称", "")) # 2. 构建Prompt prompt = GENERATE_PROMPT_TEMPLATE.format( requirements=str(requirements), platform_rules=platform_rules, similar_cases=similar_cases ) messages = [ {"role": "user", "content": SYSTEM_PROMPT}, {"role": "assistant", "content": "我已了解,请提供需求信息。"}, {"role": "user", "content": prompt} ] # 3. 调用Claude API response = await self.ai_engine.call_claude(messages, temperature=0.5) # 4. 解析结果 result = self.ai_engine.parse_json_response(response) logger.success(f"配置生成完成") return result def _get_platform_rules(self, form_type: str) -> str: """获取平台配置规则""" # 简化版本:从知识库检索 results = self.rag_engine.search(f"窗体类型{form_type}配置规则", top_k=2) return "\n\n".join([r["content"] for r in results]) def _get_similar_cases(self, keywords: str) -> str: """获取相似案例""" results = self.rag_engine.search(keywords, top_k=2) return "\n\n".join([r["content"] for r in results]) ``` - [ ] **Step 4: 运行测试验证通过** ```bash pytest tests/test_config_service.py -v ``` Expected: PASS - [ ] **Step 5: Commit** ```bash git add backend/app/services/config_service.py backend/tests/test_config_service.py git commit -m "feat: implement config generation service" ``` --- ### 任务14: 执行配置API **Files:** - Create: `backend/app/api/execute.py` - Create: `backend/app/api/generate.py` - Update: `backend/app/main.py` - [ ] **Step 1: 创建配置生成API** 创建 `backend/app/api/generate.py`: ```python from fastapi import APIRouter, HTTPException from app.models.request import GenerateRequest from app.models.response import GenerateResponse from app.services.config_service import ConfigService router = APIRouter() @router.post("/generate", response_model=GenerateResponse) async def generate_config(request: GenerateRequest): """配置生成API""" try: service = ConfigService() result = await service.generate( requirements=request.requirements, session_id=request.session_id ) return GenerateResponse( session_id=request.session_id, status="success", data=result ) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) ``` - [ ] **Step 2: 创建执行配置API** 创建 `backend/app/api/execute.py`: ```python from fastapi import APIRouter, HTTPException from app.models.request import ExecuteRequest from app.models.response import ExecuteResponse from app.core.executor import ConfigExecutor from app.services.audit_service import AuditService from app.models.audit import ExecutionLog import uuid router = APIRouter() @router.post("/execute", response_model=ExecuteResponse) async def execute_config(request: ExecuteRequest): """执行配置API""" try: executor = ConfigExecutor() audit_service = AuditService() execution_id = str(uuid.uuid4()) # TODO: 从session获取SQL列表(实际应从数据库或缓存获取) sql_list = [] # 占位符 # 执行配置 result = executor.execute_config(sql_list, request.session_id) # 记录日志 for sql in sql_list: log = ExecutionLog( session_id=request.session_id, execution_id=execution_id, action_type="EXECUTE_SQL", sql_content=sql, status="SUCCESS" if result["success"] else "FAILED", error_message=result.get("failed") ) audit_service.log_execution(log) return ExecuteResponse( execution_id=execution_id, status="success" if result["success"] else "failed", message=result["message"] ) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) ``` - [ ] **Step 3: 更新main.py注册路由** 在 `backend/app/main.py` 中添加路由: ```python from app.api import analyze, generate, execute # ...existing code... # 注册路由 app.include_router(analyze.router, prefix="/api/v1", tags=["分析"]) app.include_router(generate.router, prefix="/api/v1", tags=["生成"]) app.include_router(execute.router, prefix="/api/v1", tags=["执行"]) ``` - [ ] **Step 4: 测试API** ```bash curl -X POST http://localhost:8000/api/v1/generate \ -H "Content-Type: application/json" \ -d '{"session_id": "test", "requirements": {"功能名称": "测试"}}' ``` - [ ] **Step 5: Commit** ```bash git add backend/app/api/generate.py backend/app/api/execute.py backend/app/main.py git commit -m "feat: add generate and execute API endpoints" ``` --- ### 任务15: 前端需求输入组件 **Files:** - Create: `frontend/src/components/RequirementInput.vue` - Create: `frontend/src/api/index.js` - [ ] **Step 1: 创建API调用封装** 创建 `frontend/src/api/index.js`: ```javascript import axios from 'axios' const api = axios.create({ baseURL: '/api/v1', timeout: 60000, headers: { 'Content-Type': 'application/json' } }) export default { async analyze(content, inputType = 'natural_language') { const response = await api.post('/analyze', { input_type: inputType, content }) return response.data }, async generate(sessionId, requirements) { const response = await api.post('/generate', { session_id: sessionId, requirements }) return response.data }, async execute(sessionId, confirmed = true) { const response = await api.post('/execute', { session_id: sessionId, confirmed, backup_enabled: true }) return response.data } } ``` - [ ] **Step 2: 创建需求输入组件** 创建 `frontend/src/components/RequirementInput.vue`: ```vue ``` - [ ] **Step 3: 更新CreateFunction.vue使用组件** 更新 `frontend/src/views/CreateFunction.vue`: ```vue ``` - [ ] **Step 4: 测试组件** 访问 http://localhost:5173/create 验证组件显示和交互 - [ ] **Step 5: Commit** ```bash git add frontend/src/components/RequirementInput.vue frontend/src/api/index.js frontend/src/views/CreateFunction.vue git commit -m "feat: add requirement input component with natural language and structured form" ``` --- ## 剩余任务概要 由于篇幅限制,以下任务保持概要形式,将在执行过程中细化: ### 任务16: 配置预览组件 - SQL预览(Monaco Editor) - 风险提示显示 - 审核确认按钮 ### 任务17: 执行监控组件 - 实时日志显示 - 进度条 - WebSocket支持(可选) ### 任务18: 历史记录API和页面 - 查询历史记录API - 历史记录列表页面 - 详情查看 ### 任务19: 数据库元数据API - 表列表查询 - 表结构详情 - 功能号列表 ### 任务20: 知识库管理 - 文档上传界面 - 文档列表 - 索引重建 ### 任务21-25: 测试与部署 - 单元测试完善 - 集成测试 - Docker配置 - docker-compose编排 - README文档 --- ## 执行策略 **推荐方式**: 使用 `superpowers:subagent-driven-development` 技能 - 每个任务由独立子代理执行 - 任务间有明确的文件依赖 - 每个任务完成后进行代码审查 - 遵循TDD流程:测试先行 **关键检查点**: 1. 任务5后:知识库可正常检索 2. 任务9后:API可通过Postman测试 3. 任务11后:前端可访问和导航 4. 任务20后:核心流程打通 --- ## 风险与应对 1. **Claude API调用失败** - 确保配置正确的API Key - 网络代理问题需提前解决 2. **数据库连接失败** - 检查SQL Server配置 - 验证防火墙规则 - 测试ODBC驱动安装 3. **前后端联调问题** - 使用浏览器开发者工具检查网络请求 - 检查CORS配置 --- ## 验收标准 - [ ] 可以通过自然语言生成简单功能配置 - [ ] 生成的SQL可以成功执行 - [ ] 执行日志完整记录所有操作 - [ ] 前端界面可用,流程完整 - [ ] 核心API有单元测试覆盖 - [ ] 代码已提交到Git仓库 --- **计划创建时间**: 2026-03-21 **预计实施周期**: Phase 1约4周 **文档版本**: 1.0