feat(admin): Add user management and upgrade to module permission system

Features - User Management (Phase 4.1):
- Database: Add user_modules table for fine-grained module permissions
- Database: Add 4 user permissions (view/create/edit/delete) to role_permissions
- Backend: UserService (780 lines) - CRUD with tenant isolation
- Backend: UserController + UserRoutes (648 lines) - 13 API endpoints
- Backend: Batch import users from Excel
- Frontend: UserListPage (412 lines) - list/filter/search/pagination
- Frontend: UserFormPage (341 lines) - create/edit with module config
- Frontend: UserDetailPage (393 lines) - details/tenant/module management
- Frontend: 3 modal components (592 lines) - import/assign/configure
- API: GET/POST/PUT/DELETE /api/admin/users/* endpoints

Architecture Upgrade - Module Permission System:
- Backend: Add getUserModules() method in auth.service
- Backend: Login API returns modules array in user object
- Frontend: AuthContext adds hasModule() method
- Frontend: Navigation filters modules based on user.modules
- Frontend: RouteGuard checks requiredModule instead of requiredVersion
- Frontend: Remove deprecated version-based permission system
- UX: Only show accessible modules in navigation (clean UI)
- UX: Smart redirect after login (avoid 403 for regular users)

Fixes:
- Fix UTF-8 encoding corruption in ~100 docs files
- Fix pageSize type conversion in userService (String to Number)
- Fix authUser undefined error in TopNavigation
- Fix login redirect logic with role-based access check
- Update Git commit guidelines v1.2 with UTF-8 safety rules

Database Changes:
- CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled)
- ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code)
- INSERT 4 permissions + role assignments
- UPDATE PUBLIC tenant with 8 module subscriptions

Technical:
- Backend: 5 new files (~2400 lines)
- Frontend: 10 new files (~2500 lines)
- Docs: 1 development record + 2 status updates + 1 guideline update
- Total: ~4900 lines of code

Status: User management 100% complete, module permission system operational
This commit is contained in:
2026-01-16 13:42:10 +08:00
parent 98d862dbd4
commit 66255368b7
560 changed files with 70424 additions and 52353 deletions

View File

@@ -1,23 +1,23 @@
# 宸ュ叿C Day 3 寮€鍙戣<EFBFBD>鍒?- AI浠爜鐢熸垚鏈嶅姟
# 工具C Day 3 开发计划 - AI代码生成服务
> **文档版本**: V1.0
> **创建日期**: 2025-12-06
> **寮€鍙戠洰鏍?*: AI浠爜鐢熸垚 + Python鎵ц<E98EB5> + 鑷<>垜淇<E59E9C><E6B787>
> **开发目标**: AI代码生成 + Python执行 + 自我修正
> **预计工时**: 5.5-6小时
> **渚濊禆**: Day 2宸插畬鎴愶紙Session绠$悊锛?
> **依赖**: Day 2已完成(Session管理)
---
## 📋 核心决策总结
### 鍐崇瓥1: 瀵硅瘽瀛樺偍鏂瑰紡 鉁?
### 决策1: 对话存储方式 ✅
**鏂规<EFBFBD>閫夋嫨**: 鍒涘缓鐙<EFBFBD>珛琛?`dc_tool_c_ai_history`
**方案选择**: 创建独立表 `dc_tool_c_ai_history`
**理由**:
- 未来模块可能独立销售或独立部署
- 符合Schema隔离原则
- Tool C鏈夌壒娈婂瓧娈甸渶姹傦紙code銆乪xecuteResult锛?
- Tool C有特殊字段需求(code、executeResult
**数据库Schema**:
```prisma
@@ -29,7 +29,7 @@ model DcToolCAiHistory {
content String @db.Text
// Tool C特有字段
generatedCode String? @db.Text // AI鐢熸垚鐨勪唬鐮?
generatedCode String? @db.Text // AI生成的代码
codeExplanation String? @db.Text // 代码解释
executeStatus String? // success/failed/pending
executeResult Json? // 执行结果
@@ -48,80 +48,80 @@ model DcToolCAiHistory {
---
### 鍐崇瓥2: AI爜鎵ц<EFBFBD>娴佺▼ 鉁?
### 决策2: AI代码执行流程 ✅
**鏂规<EFBFBD>閫夋嫨**: 鐢ㄦ埛纭<EFBFBD><EFBFBD>鍚庢墽琛岋紙鏂规<EFBFBD>A锛?
**方案选择**: 用户确认后执行方案A
**流程**:
```
用户输入自然语言
鈫?
AI生成代码 + 解释
鈫?
前端展示代码(高亮)
鈫?
鐢ㄦ埛鐐瑰嚮"鎵ц<E98EB5>"鎸夐挳 鈫?鐢ㄦ埛纭<E59F9B><E7BAAD>
鈫?
用户点击"执行"按钮 ← 用户确认
Python服务执行代码
鈫?
返回结果 + 数据预览前50行
```
**理由**:
- 鉁?鐢ㄦ埛鍙<E59F9B><E98D99>鏌ヤ唬鐮侊紙瀹夊叏鍙<E58F8F>帶锛?
- 鉁?绗﹀悎"AI杈呭姪"鑰岄潪"AI鑷<49>姩"鐨勫畾浣?
- 鉁?闄嶄綆鎵ц<E98EB5>閿欒<E996BF>椋庨櫓
- ✅ 用户可审查代码(安全可控)
- ✅ 符合"AI辅助"而非"AI自动"的定位
- ✅ 降低执行错误风险
---
### 鍐崇瓥3: System Prompt璁捐<EFBFBD> 鉁?
### 决策3: System Prompt设计 ✅
**鏂规<EFBFBD>閫夋嫨**: 瀹屾暣鐗?0涓狥ew-shot绀轰緥
**方案选择**: 完整版10个Few-shot示例
**示例分布**:
| 级别 | 数量 | 示例编号 | 场景 |
|------|------|---------|------|
| Level 1 | 2涓?| 1-2 | 缂哄け鍊肩粺涓€銆佹暟鍊兼竻娲?|
| Level 2 | 2涓?| 3-4 | 缂栫爜銆佸垎绠?|
| Level 3 | 3涓?| 5-7 | BMI銆佹棩鏈熴€佺瓫閫?|
| Level 4 | 3涓?| 8-10 | 绠€鍗曞~琛ャ€?*澶氶噸鎻掕ˉ**銆佸幓閲?|
| Level 1 | 2| 1-2 | 缺失值统一、数值清洗 |
| Level 2 | 2| 3-4 | 编码、分箱 |
| Level 3 | 3| 5-7 | BMI、日期、筛选 |
| Level 4 | 3| 8-10 | 简单填补、**多重插补**、去重 |
**核心亮点**:
- 鉁?鍖呭惈缂哄け鍊煎<E98D8A>鐞嗭紙绀轰緥8锛?
- 鉁?鍖呭惈澶氶噸鎻掕ˉMICE锛堢ず渚?锛夆瓙 閲嶇偣
- 鉁?瑕嗙洊浠庡熀纭€鍒伴珮绾у叏姊<E58F8F>
- ✅ 包含缺失值处理示例8
- ✅ 包含多重插补MICE示例9⭐ 重点
- ✅ 覆盖从基础到高级全梯度
**鏂囨。浣嶇疆**: [宸ュ叿C_AI_Few-shot绀轰緥搴?md](./宸ュ叿C_AI_Few-shot绀轰緥搴?md)
**文档位置**: [工具C_AI_Few-shot示例库.md](./工具C_AI_Few-shot示例库.md)
---
### 鍐崇瓥4: 鏁版嵁鐘舵€佺<E282AC>鐞?鉁?
### 决策4: 数据状态管理 ✅
**鏂规<EFBFBD>閫夋嫨**: Python鍐呭瓨缁存姢锛堟柟妗圕锛?
**方案选择**: Python内存维护方案C
**架构**:
```
Session鍒涘缓 鈫?鏁版嵁鍔犺浇鍒癙ython鍐呭瓨
鈫?
AI鎿嶄綔1 鈫?淇<>敼鍐呭瓨涓<E793A8>DataFrame
鈫?
AI鎿嶄綔2 鈫?缁х画淇<E794BB>DataFrame锛堢疮绉<EFBFBD>
鈫?
AI鎿嶄綔N 鈫?...
鈫?
鐢ㄦ埛鐐瑰嚮"瀵煎嚭" 鈫?淇濆瓨鍒癘SS
Session创建 → 数据加载到Python内存
AI操作1 → 修改内存中的DataFrame
AI操作2 → 继续修改DataFrame(累积)
AI操作N → ...
用户点击"导出" → 保存到OSS
```
**技术债务**:
- 馃摑 Python閲嶅惎浼氫涪澶辩姸鎬?
- 📝 Python重启会丢失状态
- 📝 未来优化持久化到Redis或OSS
- 📝 文档位置: [技术债务清单](../07-技术债务/Tool-C技术债务清单.md)
---
### 鍐崇瓥5: AI<EFBFBD>垜淇<EFBFBD><EFBFBD>鏈哄埗 鉁?
### 决策5: AI自我修正机制 ✅
**鏂规<EFBFBD>閫夋嫨**: 鏈€澶?娆¢噸璇曪紙鏂规<E98F82>B锛?
**方案选择**: 最多3次重试方案B
**流程**:
```python
@@ -134,18 +134,18 @@ while attempt < 3:
result = execute_code(code)
if result.success:
return result # 鉁?鎴愬姛
return result # ✅ 成功
error_feedback = result.error
attempt += 1
# 鉂?3娆粛澶辫触锛岃繑鍥炲弸濂介敊璇?
# ❌ 3次仍失败返回友好错误
return "执行失败,请调整需求后重试"
```
---
### 鍐崇瓥6: LLM妯″瀷閫夋嫨 鉁?
### 决策6: LLM模型选择 ✅
**优先使用**: DeepSeek-V3
@@ -153,21 +153,21 @@ return "执行失败,请调整需求后重试"
```typescript
const llm = LLMFactory.createAdapter('deepseek-v3');
const response = await llm.chat(messages, {
temperature: 0.1, // 浣庢俯搴︼紝纭<EFBFBD>繚浠爜鍑嗙鎬?
temperature: 0.1, // 低温度,确保代码准确性
maxTokens: 2000, // 足够生成代码+解释
topP: 0.9
});
```
**澶囬€夋柟妗?*:
**备选方案**:
- Qwen3-72B: 中文理解更好
- GPT-5-Pro: 代码质量最高(成本高)
---
### 鍐崇瓥7: 涓婁笅鏂囦紶閫?鉁?
### 决策7: 上下文传递 ✅
**閰嶇疆**: 浼犻€掓渶杩?杞<><E69D9E>璇?
**配置**: 传递最近5轮对话
**实现**:
```typescript
@@ -179,85 +179,85 @@ async getConversationHistory(sessionId: string, limit: number = 5) {
});
}
// 鏋勫缓娑堟伅涓婁笅鏂?
// 构建消息上下文
const messages = [
{ role: 'system', content: systemPrompt },
...history.reverse(), // 鏈€杩?杞?
...history.reverse(), // 最近5轮
{ role: 'user', content: userMessage }
];
```
---
### 鍐崇瓥8: 鎵ц<E98EB5>缁撴灉灞曠ず 鉁?
### 决策8: 执行结果展示 ✅
**閰嶇疆**: 杩斿洖鍓?0琛岄<E7909B>瑙?
**配置**: 返回前50行预览
**原因**:
- 50琛岃冻澶熸煡鐪嬫暟鎹<EFBFBD>彉鍖?
- 50行足够查看数据变化
- 不会过大影响性能
- 绗﹀悎鍖荤枟鏁版嵁鍦烘櫙锛堥€氬父鍑犲崄鍒板嚑鐧捐<EFBFBD>锛?
- 符合医疗数据场景(通常几十到几百行)
---
### 鍐崇瓥9: Few-shot绀轰緥纭<EFBFBD><EFBFBD> 鉁?
### 决策9: Few-shot示例确认 ✅
**鏈€缁?0涓<30>ず渚?*:
1. 缁熶竴缂哄け鍊兼爣璁?
**最终10个示例**:
1. 统一缺失值标记
2. 数值列清洗(检验值符号处理)
3. 鍒嗙被鍙橀噺缂栫爜锛堟€у埆鈫?/0锛?
3. 分类变量编码性别→1/0
4. 连续变量分箱(年龄分组)
5. BMI璁$畻涓庡垎绫?
5. BMI计算与分类
6. 日期计算(住院天数)
7. 鏉′欢绛涢€夛紙鍏ョ粍鏍囧噯锛?
7. 条件筛选(入组标准)
8. 简单缺失值填补(中位数)
9. **澶氶噸鎻掕ˉMICE** 猸?鏍稿績
9. **多重插补MICE** ⭐ 核心
10. 智能去重(按日期保留最新)
---
## 馃彈锔?鎶€鏈<E282AC>灦鏋勮<E98F8B>璁?
## 🏗️ 技术架构设计
### 整体架构
```
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹? Frontend (React) 鈹?
鈹? - 瀵硅瘽鐣岄潰锛圱ool C涓撶敤锛? 鈹?
鈹? - 爜灞曠ず锛堥珮浜<EFBFBD> 鈹?
鈹? - 鎵ц<EFBFBD>鎸夐挳 鈹?
鈹? - 缁撴灉棰勮<EFBFBD>锛圓G Grid锛? 鈹?
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹?REST API
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈻尖攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹? Node.js Backend (Fastify) 鈹?
鈹? 鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹?
鈹? 鈹?AICodeService 鈹? 鈹?
鈹? 鈹?- generateCode() 鈹? 鈹?
鈹? 鈹?- executeCode() 鈹? 鈹?
鈹? 鈹?- generateAndExecute() (甯﹂噸璇? 鈹? 鈹?
鈹? 鈹?- getHistory() 鈹? 鈹?
鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<E282AC>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<E282AC>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹?
鈹? 鈹? 鈹? 鈹?
鈹? 鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈻尖攢鈹€鈹€鈹€鈹€鈹? 鈹屸攢鈹€鈹€鈹€鈻尖攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹?
鈹? 鈹?LLMFactory 鈹? 鈹?PythonExecutor鈹? 鈹?
鈹? 鈹?(閫氱敤灞傚<E7819E>鐢?鈹? 鈹?Service 鈹? 鈹?
鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹<E282AC>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹?
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹尖攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹?HTTP
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈻尖攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹?Python Service (FastAPI) 鈹?
鈹?- /api/dc/validate (AST妫€鏌? 鈹?
鈹?- /api/dc/execute (鎵ц<EFBFBD>爜) 鈹?
鈹?- Session鐘舵€佺<EFBFBD>鐞嗭紙鍐呭瓨锛? 鈹?
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
┌─────────────────────────────────────────────────┐
Frontend (React)
- 对话界面Tool C专用
- 代码展示(高亮)
- 执行按钮
- 结果预览AG Grid
└──────────────┬──────────────────────────────────┘
REST API
┌──────────────▼──────────────────────────────────┐
Node.js Backend (Fastify)
│ ┌─────────────────────────────────────────┐ │
│ │ AICodeService
│ │ - generateCode()
│ │ - executeCode()
│ │ - generateAndExecute() (带重试)
│ │ - getHistory()
│ └──────────┬───────────────┬──────────────┘
┌───────▼─────┐ ┌────▼──────────┐
LLMFactory │ │ PythonExecutor
│ (通用层复用)│ │ Service
└─────────────┘ └───────┬───────┘
└──────────────────────────────┼─────────────────┘
HTTP
┌───────────▼──────────────────┐
Python Service (FastAPI)
- /api/dc/validate (AST检查) │
- /api/dc/execute (执行代码) │
- Session状态管理(内存)
└──────────────────────────────┘
```
---
### 核心服务设计
#### AICodeService (鏂板缓锛寏400琛?
#### AICodeService (新建,~400行)
```typescript
// backend/src/modules/dc/tool-c/services/AICodeService.ts
@@ -268,7 +268,7 @@ export class AICodeService {
/**
* 生成Pandas代码
* @param sessionId - Tool C Session ID
* @param userMessage - 鐢ㄦ埛鑷<EFBFBD>劧璇<EFBFBD>█闇€姹?
* @param userMessage - 用户自然语言需求
* @returns { code, explanation, messageId }
*/
async generateCode(
@@ -278,13 +278,13 @@ export class AICodeService {
// 1. 获取Session信息数据集元数据
const session = await sessionService.getSession(sessionId);
// 2. 鏋勫缓System Prompt锛堝惈10涓狥ew-shot锛?
// 2. 构建System Prompt含10个Few-shot
const systemPrompt = this.buildSystemPrompt(session);
// 3. 鑾峰彇瀵硅瘽鍘嗗彶锛堟渶杩?杞<>
// 3. 获取对话历史最近5轮
const history = await this.getHistory(sessionId, 5);
// 4. 璋冪敤LLM锛堝<EFBFBD>鐢↙LMFactory锛?
// 4. 调用LLM复用LLMFactory
const llm = LLMFactory.createAdapter('deepseek-v3');
const response = await llm.chat([
{ role: 'system', content: systemPrompt },
@@ -295,7 +295,7 @@ export class AICodeService {
maxTokens: 2000
});
// 5. 瀽AI鍥炲<EFBFBD>锛堟彁鍙朿ode鍜宔xplanation锛?
// 5. 解析AI回复提取code和explanation
const parsed = this.parseAIResponse(response.content);
// 6. 保存到数据库
@@ -327,10 +327,10 @@ export class AICodeService {
): Promise<ExecuteCodeResult> {
// 1. 调用Python服务执行
const result = await pythonExecutorService.executeCode(code, {
sessionId // Python鏈嶅姟缁存姢Session鐘舵€?
sessionId // Python服务维护Session状态
});
// 2. 鏇存柊娑堟伅鐘舵€?
// 2. 更新消息状态
await prisma.dcToolCAiHistory.update({
where: { id: messageId },
data: {
@@ -359,8 +359,8 @@ export class AICodeService {
/**
* 生成并执行(带自我修正)
* @param sessionId - Tool C Session ID
* @param userMessage - 鐢ㄦ埛闇€姹?
* @param maxRetries - 鏈€澶ч噸璇曟<EFBFBD>鏁帮紙榛樿<EFBFBD>3锛?
* @param userMessage - 用户需求
* @param maxRetries - 最大重试次数默认3
* @returns { code, explanation, executeResult, retryCount }
*/
async generateAndExecute(
@@ -374,10 +374,10 @@ export class AICodeService {
while (attempt < maxRetries) {
try {
// 鏋勫缓甯﹂敊璇<EFBFBD>弽棣堢殑鎻愮ず璇?
// 构建带错误反馈的提示词
const enhancedMessage = attempt === 0
? userMessage
: `${userMessage}\n\n涓婃<EFBFBD>鎵ц<EFBFBD>閿欒<EFBFBD>锛?{lastError}\n璇蜂慨姝d唬鐮併€俙;
: `${userMessage}\n\n上次执行错误:${lastError}\n请修正代码。`;
// 生成代码
generated = await this.generateCode(sessionId, enhancedMessage);
@@ -390,8 +390,8 @@ export class AICodeService {
);
if (executeResult.success) {
// 鉁?鎴愬姛
logger.info(`[AICodeService] ц<EFBFBD>?{attempt + 1}`);
// ✅ 成功
logger.info(`[AICodeService] 执行成功(尝试${attempt + 1}次)`);
return {
...generated,
executeResult,
@@ -399,11 +399,11 @@ export class AICodeService {
};
}
// 鉂?澶辫触锛屽噯澶囬噸璇?
// ❌ 失败,准备重试
lastError = executeResult.error || '未知错误';
attempt++;
logger.warn(`[AICodeService] ц<EFBFBD>?{attempt}/${maxRetries}? ${lastError}`);
logger.warn(`[AICodeService] 执行失败(尝试${attempt}/${maxRetries}: ${lastError}`);
} catch (error: any) {
logger.error(`[AICodeService] 异常: ${error.message}`);
@@ -438,48 +438,48 @@ export class AICodeService {
// ==================== 辅助方法 ====================
/**
* 鏋勫缓System Prompt锛堝惈10涓狥ew-shot锛?
* 构建System Prompt含10个Few-shot
*/
private buildSystemPrompt(session: SessionData): string {
return `<EFBFBD>andas浠爜鏉ユ竻娲楁暣鐞嗘暟鎹<EFBFBD>?
return `你是医疗科研数据清洗专家负责生成Pandas代码来清洗整理数据。
## ?
- ? ${session.fileName}
## 当前数据集信息
- 文件名: ${session.fileName}
- 行数: ${session.totalRows}
- 列数: ${session.totalCols}
- 列名: ${session.columns.join(', ')}
## 安全规则(强制)
1. <EFBFBD>df鍙橀噺锛屼笉鑳戒慨鏀瑰叾浠栧彉閲?
2. <EFBFBD>os銆乻ys銆乻ubprocess绛夊嵄闄ā?
3. <EFBFBD>eval銆乪xec銆乢_import__绛夊嵄闄?
1. 只能操作df变量不能修改其他变量
2. 禁止导入os、sys、subprocess等危险模块
3. 禁止使用eval、exec、__import__等危险函数
4. 必须进行异常处理
5. 返回格式必须是JSON: {"code": "...", "explanation": "..."}
## Few-shot示例
### 绀轰緥1: 缁熶竴缂哄け鍊兼爣璁?
鐢ㄦ埛: 鎶婃墍鏈変唬琛ㄧ己澶辩殑绗彿?A銆丯/A锛夌粺涓?
### 示例1: 统一缺失值标记
用户: 把所有代表缺失的符号(-、不详、NA、N/A统一替换为标准空值
代码:
\`\`\`python
df = df.replace(['-', '不详', 'NA', 'N/A', '\\\\', '未查'], np.nan)
\`\`\`
璇存槑: 灏嗗<E7818F>绉嶇己澶卞€艰〃绀虹粺涓€涓篘aN锛屼究浜庡悗缁<E68297>粺璁″垎鏋?
说明: 将多种缺失值表示统一为NaN便于后续统计分析
### 示例2: 数值列清洗
鐢ㄦ埛: 鎶婅倢閰愬垪閲岀殑闈炴暟瀛楃<E7809B>鍙峰幓鎺夛紝<0.1鎸?.05澶勭悊锛岃浆涓烘暟鍊肩被鍨?
用户: 把肌酐列里的非数字符号去掉,<0.1按0.05处理,转为数值类型
代码:
\`\`\`python
df['creatinine'] = df['creatinine'].astype(str).str.replace('>', '').str.replace('<', '')
df.loc[df['creatinine'] == '0.1', 'creatinine'] = '0.05'
df['creatinine'] = pd.to_numeric(df['creatinine'], errors='coerce')
\`\`\`
璇存槑: 妫€楠岀<E6A5A0>鏁版嵁甯稿惈绗﹀彿锛岄渶娓呯悊鍚庢墠鑳借<E991B3>绠?
说明: 检验科数据常含符号,需清理后才能计算
[... 示例3-8 ...]
### 示例9: 多重插补MICE⭐ 重点
鐢ㄦ埛: 浣跨敤澶氶噸鎻掕ˉ娉曞<E5A889>BMI銆佸勾榫勩€佽倢閰愬垪鐨勭己澶卞€艰繘琛屽琛?
用户: 使用多重插补法对BMI、年龄、肌酐列的缺失值进行填补
代码:
\`\`\`python
from sklearn.experimental import enable_iterative_imputer
@@ -504,12 +504,12 @@ df = df.sort_values('check_date').drop_duplicates(subset=['patient_id'], keep='l
说明: 先按日期排序,再去重保留最后一条(最新)
## 用户当前请求
璇锋牴鎹<EFBFBD>互涓婄ず渚嬪拰褰撳墠鏁版嵁闆嗕俊鎭<EFBFBD>紝鐢熸垚浠爜骞惰В閲娿€?
请根据以上示例和当前数据集信息,生成代码并解释。
`;
}
/**
* 瀽AI鍥炲<EFBFBD>锛堟彁鍙朿ode鍜宔xplanation锛?
* 解析AI回复提取code和explanation
*/
private parseAIResponse(content: string): { code: string; explanation: string } {
try {
@@ -531,7 +531,7 @@ df = df.sort_values('check_date').drop_duplicates(subset=['patient_id'], keep='l
}
}
throw new Error('AI鍥炲<EFBFBD>鏍煎紡閿欒<EFBFBD>锛屾棤娉曟彁鍙栦唬鐮?);
throw new Error('AI回复格式错误,无法提取代码');
}
/**
@@ -577,7 +577,7 @@ export const aiCodeService = new AICodeService();
---
#### AIController (鏂板缓锛寏200琛?
#### AIController (新建,~200行)
```typescript
// backend/src/modules/dc/tool-c/controllers/AIController.ts
@@ -585,7 +585,7 @@ export class AIController {
/**
* POST /api/v1/dc/tool-c/ai/generate
* 鐢熸垚浠爜锛堜笉鎵ц<EFBFBD>锛?
* 生成代码(不执行)
*/
async generateCode(request: FastifyRequest, reply: FastifyReply) {
try {
@@ -697,24 +697,24 @@ export const aiController = new AIController();
---
## 馃搮 寮€鍙戣<E98D99>鍒?
## 📅 开发计划
### 阶段1: 数据库设计30分钟⏰ 09:00-09:30
**任务清单**:
- [ ] 鏇存柊 `backend/prisma/schema.prisma`锛堟坊鍔燚cToolCAiHistory妯″瀷锛?
- [ ] 鍒涘缓鏁版嵁搴撹縼绉昏剼鏈?`create-tool-c-ai-history-table.mjs`
- [ ] 鎵ц<EFBFBD>杩佺Щ锛堝垱寤鸿〃锛?
- [ ] 楠岃瘉琛ㄧ粨鏋?
- [ ] 更新 `backend/prisma/schema.prisma`添加DcToolCAiHistory模型)
- [ ] 创建数据库迁移脚本 `create-tool-c-ai-history-table.mjs`
- [ ] 执行迁移(创建表)
- [ ] 验证表结构
- [ ] 生成Prisma Client (`npx prisma generate`)
**浜や粯鐗?*:
- 鉁?`dc_schema.dc_tool_c_ai_history` 琛ㄥ垱寤烘垚鍔?
- 鉁?Prisma Client鏇存柊瀹屾垚
**交付物**:
- `dc_schema.dc_tool_c_ai_history` 表创建成功
- Prisma Client更新完成
---
### 闃舵<EFBFBD>2: AICodeService瀹炵幇锛?灏忔椂锛夆彴 09:30-11:30
### 阶段2: AICodeService实现2小时 09:30-11:30
**任务清单**:
- [ ] 创建 `AICodeService.ts` 基础结构
@@ -725,88 +725,88 @@ export const aiController = new AIController();
- [ ] 实现 `generateAndExecute()` - 生成+执行+重试
- [ ] 实现 `getHistory()` - 获取对话历史
- [ ] 实现 `saveMessages()` - 保存消息到数据库
- [ ] 娣诲姞瀹屾暣閿欒<EFBFBD>澶勭悊鍜屾棩蹇?
- [ ] 添加完整错误处理和日志
**浜や粯鐗?*:
- 鉁?`AICodeService.ts` 瀹屾暣瀹炵幇锛垀400琛岋級
- 鉁?鍗曞厓娴嬭瘯閫氳繃
**交付物**:
- `AICodeService.ts` 完整实现(~400行
- ✅ 单元测试通过
---
### 闃舵<EFBFBD>3: AIController瀹炵幇锛?灏忔椂锛夆彴 11:30-12:30
### 阶段3: AIController实现1小时 11:30-12:30
**任务清单**:
- [ ] 创建 `AIController.ts`
- [ ] 实现 `POST /ai/generate` - 生成代码
- [ ] 实现 `POST /ai/execute` - 执行代码
- [ ] 瀹炵幇 `POST /ai/process` - 涓€姝ュ埌浣?
- [ ] 实现 `POST /ai/process` - 一步到位
- [ ] 实现 `GET /ai/history/:sessionId` - 对话历史
- [ ] 添加参数验证
- [ ] 添加错误处理
**浜や粯鐗?*:
- 鉁?`AIController.ts` 瀹屾暣瀹炵幇锛垀200琛岋級
- 鉁?4涓狝PI绔<49>偣灏辩华
**交付物**:
- `AIController.ts` 完整实现(~200行
- ✅ 4个API端点就绪
---
### 鍗堜紤 鈴?12:30-13:30
### 午休 ⏰ 12:30-13:30
---
### 闃舵<EFBFBD>4: 璺<>敱閰嶇疆锛?5鍒嗛挓锛夆彴 13:30-13:45
### 阶段4: 路由配置15分钟 13:30-13:45
**任务清单**:
- [ ] 更新 `routes/index.ts`
- [ ] 注册AI相关路由
- [ ] 娴嬭瘯璺<EFBFBD>敱鍙<EFBFBD><EFBFBD><EFBFBD>€?
- [ ] 测试路由可访问性
**浜や粯鐗?*:
- 鉁?AI璺<49>敱娉ㄥ唽瀹屾垚
- 鉁?Swagger鏂囨。鏇存柊锛堝<EFBFBD>鏈夛級
**交付物**:
- ✅ AI路由注册完成
- Swagger文档更新(如有)
---
### 闃舵<EFBFBD>5: 娴嬭瘯楠屾敹锛?.5灏忔椂锛夆彴 13:45-15:15
### 阶段5: 测试验收1.5小时)⏰ 13:45-15:15
#### 5.1 鍩虹<EFBFBD>娴嬭瘯锛?0鍒嗛挓锛?
#### 5.1 基础测试30分钟
**测试用例**:
1. [ ] 娴嬭瘯1: 缁熶竴缂哄け鍊兼爣璁?
1. [ ] 测试1: 统一缺失值标记
2. [ ] 测试2: 数值列清洗
3. [ ] 测试3: 性别编码
4. [ ] 测试4: 年龄分组
**验收标准**:
- AI鑳芥<EFBFBD><EFBFBD>敓鎴愪唬鐮?
- 爜鍙<EFBFBD>墽琛?
- AI能正确生成代码
- 代码可执行
- 结果符合预期
#### 5.2 <EFBFBD>骇娴嬭瘯锛?0鍒嗛挓锛?
#### 5.2 中级测试30分钟
**测试用例**:
5. [ ] 测试5: BMI计算
6. [ ] 测试6: 住院天数计算
7. [ ] 娴嬭瘯7: 鏉′欢绛涢€?
7. [ ] 测试7: 条件筛选
#### 5.3 楂樼骇娴嬭瘯锛?0鍒嗛挓锛?
#### 5.3 高级测试30分钟
**测试用例**:
8. [ ] 娴嬭瘯8: 涓<>綅鏁板琛?
9. [ ] 娴嬭瘯9: 澶氶噸鎻掕ˉMICE 猸?
8. [ ] 测试8: 中位数填补
9. [ ] 测试9: 多重插补MICE
10. [ ] 测试10: 智能去重
#### 5.4 鐗规畩娴嬭瘯锛?0鍒嗛挓锛?
#### 5.4 特殊测试30分钟
**测试用例**:
11. [ ] <EFBFBD>垜淇<EFBFBD><EFBFBD>娴嬭瘯锛堟晠鎰忛敊璇<EFBFBD>紝楠岃瘉閲嶈瘯鏈哄埗锛?
12. [ ] 杈圭晫娴嬭瘯锛堝垪涓嶅瓨鍦ㄣ€佸叏閮ㄧ己澶辩瓑锛?
13. [ ] 骞跺彂娴嬭瘯锛堝<EFBFBD>鐢ㄦ埛鍚屾椂浣跨敤锛?
11. [ ] 自我修正测试(故意错误,验证重试机制)
12. [ ] 边界测试(列不存在、全部缺失等)
13. [ ] 并发测试(多用户同时使用)
14. [ ] 端到端测试上传→AI处理→结果验证
**浜や粯鐗?*:
- 鉁?娴嬭瘯鑴氭湰 `test-tool-c-day3.mjs`
- 鉁?娴嬭瘯鎶ュ憡锛堥€氳繃鐜団墺90%锛?
**交付物**:
- ✅ 测试脚本 `test-tool-c-day3.mjs`
- ✅ 测试报告(通过率≥90%
---
@@ -814,14 +814,14 @@ export const aiController = new AIController();
**任务清单**:
- [ ] 创建技术债务清单 `Tool-C技术债务清单.md`
- [ ] 鏇存柊妯″潡鐘舵€佹枃妗?`00-宸ュ叿C褰撳墠鐘舵€佷笌寮€鍙戞寚鍗?md`
- [ ] 更新模块状态文档 `00-工具C当前状态与开发指南.md`
- [ ] 创建Day 3开发完成总结
- [ ] 鎻愪氦Git骞舵帹閫?
- [ ] 提交Git并推送
**浜や粯鐗?*:
- 鉁?鎶€鏈<E282AC>€哄姟鏂囨。
- 鉁?Day 3寮€鍙戣<EFBFBD>褰?
- 鉁?Git鎻愪氦鎴愬姛
**交付物**:
- ✅ 技术债务文档
- Day 3开发记录
- Git提交成功
---
@@ -829,116 +829,116 @@ export const aiController = new AIController();
### 功能验收
| 鍔熻兘 | 楠屾敹鏍囧噯 | 鐘舵€?|
| 功能 | 验收标准 | 状态 |
|------|---------|------|
| AI浠g爜鐢熸垚 | 10涓<30>ず渚嬪満鏅?00%鍙<>敓鎴愭<E98EB4><EFBFBD>唬鐮?| 鈴革笍 |
| AI代码生成 | 10个示例场景100%可生成正确代码 | ⏸️ |
| 代码执行 | 生成的代码可成功执行 | ⏸️ |
| <EFBFBD>垜淇<EFBFBD><EFBFBD> | 澶辫触鍚庤兘鑷<E58598>姩閲嶈瘯锛堟渶澶?娆★級 | 鈴革笍 |
| 瀵硅瘽鍘嗗彶 | 鑳借幏鍙栨渶杩?杞<><E69D9E>璇?| 鈴革笍 |
| 鏁版嵁棰勮<EFBFBD> | 鎵ц<E98EB5>鍚庤繑鍥炲墠50琛岄<E7909B>瑙?| 鈴革笍 |
| 自我修正 | 失败后能自动重试最多3次 | ⏸️ |
| 对话历史 | 能获取最近5轮对话 | ⏸️ |
| 数据预览 | 执行后返回前50行预览 | ⏸️ |
### 鎶€鏈<EFBFBD>獙鏀?
### 技术验收
| 鎸囨爣 | 鐩<>爣 | 鐘舵€?|
| 指标 | 目标 | 状态 |
|------|------|------|
| 代码质量 | 无TypeScript错误 | ⏸️ |
| 浜戝師鐢熻<EFBFBD>鑼?| 100%绗﹀悎 | 鈴革笍 |
| 閿欒<EFBFBD>澶勭悊 | 鎵€鏈夊紓甯搁兘鏈夊<E98F88>鐞?| 鈴革笍 |
| 鏃ュ織瀹屾暣鎬?| 鍏抽敭鎿嶄綔閮芥湁鏃ュ織 | 鈴革笍 |
| 娴嬭瘯瑕嗙洊鐜?| 鈮?0% | 鈴革笍 |
| 云原生规范 | 100%符合 | ⏸️ |
| 错误处理 | 所有异常都有处理 | ⏸️ |
| 日志完整性 | 关键操作都有日志 | ⏸️ |
| 测试覆盖率 | ≥80% | ⏸️ |
### 性能验收
| 鎸囨爣 | 鐩<>爣 | 鐘舵€?|
| 指标 | 目标 | 状态 |
|------|------|------|
| AI鐢熸垚鏃堕棿 | <5绉?| 鈴革笍 |
| AI生成时间 | <5秒 | ⏸️ |
| 代码执行时间 | <3秒简单操作 | ⏸️ |
| <EFBFBD>埌绔<EFBFBD>椂闂?| <10绉?| 鈴革笍 |
| 端到端时间 | <10秒 | ⏸️ |
---
## 📦 交付清单
### 浠g爜鏂囦欢锛?涓<>
### 代码文件6个
1. 鉁?`backend/prisma/schema.prisma` - 鏂板<EFBFBD>DcToolCAiHistory妯″瀷
2. 鉁?`backend/scripts/create-tool-c-ai-history-table.mjs` - 寤鸿〃鑴氭湰
3. 鉁?`backend/src/modules/dc/tool-c/services/AICodeService.ts` - 400琛?
4. 鉁?`backend/src/modules/dc/tool-c/controllers/AIController.ts` - 200琛?
5. 鉁?`backend/src/modules/dc/tool-c/routes/index.ts` - 鏇存柊
6. 鉁?`backend/test-tool-c-day3.mjs` - 娴嬭瘯鑴氭湰
1. `backend/prisma/schema.prisma` - 新增DcToolCAiHistory模型
2. `backend/scripts/create-tool-c-ai-history-table.mjs` - 建表脚本
3. `backend/src/modules/dc/tool-c/services/AICodeService.ts` - 400
4. `backend/src/modules/dc/tool-c/controllers/AIController.ts` - 200
5. `backend/src/modules/dc/tool-c/routes/index.ts` - 更新
6. `backend/test-tool-c-day3.mjs` - 测试脚本
### 鏂囨。鏂囦欢锛?涓<>
### 文档文件4个
1. 鉁?`宸ュ叿C_AI_Few-shot绀轰緥搴?md` - 10<EFBFBD>ず渚嬭<EFBFBD>瑙?
2. 鉁?`宸ュ叿C_Day3寮€鍙戣<E98D99>鍒?md` - <EFBFBD>枃妗?
3. 鉁?`Tool-C鎶€鏈<EFBFBD>€哄姟娓呭崟.md` - 寰呬紭鍖栭」
4. 鉁?`2025-12-06_宸ュ叿C_Day3寮€鍙戝畬鎴愭€荤粨.md` - 鎬荤粨鎶ュ憡
1. `工具C_AI_Few-shot示例库.md` - 10个示例详解
2. `工具C_Day3开发计划.md` - 本文档
3. `Tool-C技术债务清单.md` - 待优化项
4. `2025-12-06_工具C_Day3开发完成总结.md` - 总结报告
---
## 🔗 相关文档
- [宸ュ叿C_AI_Few-shot绀轰緥搴?md](./宸ュ叿C_AI_Few-shot绀轰緥搴?md)
- [工具C_AI_Few-shot示例库.md](./工具C_AI_Few-shot示例库.md)
- [工具C_MVP开发计划_V1.0.md](./工具C_MVP开发计划_V1.0.md)
- [通用对话服务抽取计划.md](../../../08-项目管理/05-技术债务/通用对话服务抽取计划.md)
- [浜戝師鐢熷紑鍙戣<EFBFBD>鑼?md](../../../04-寮€鍙戣<EFBFBD>鑼?08-浜戝師鐢熷紑鍙戣<E98D99>鑼?md)
- [云原生开发规范.md](../../../04-开发规范/08-云原生开发规范.md)
---
## 🔄 风险管理
### 椋庨櫓1: AI鐢熸垚浠g爜璐ㄩ噺涓嶇ǔ瀹?
### 风险1: AI生成代码质量不稳定
**应对措施**:
- 鉁?浣跨敤10涓狥ew-shot绀轰緥鎻愬崌璐ㄩ噺
- 鉁?闄嶄綆temperature鑷?.1
- 鉁?瀹炴柦3娆¢噸璇曟満鍒?
- 鉁?娣诲姞AST闈欐€佹<E282AC>鏌ワ紙Python鏈嶅姟锛?
- ✅ 使用10个Few-shot示例提升质量
- ✅ 降低temperature至0.1
- ✅ 实施3次重试机制
- ✅ 添加AST静态检查Python服务)
### 风险2: LLM调用超时
**应对措施**:
- 鉁?璁剧疆鍚堢悊鐨則imeout锛?0绉掞級
- 鉁?鍓嶇<E98D93>鏄剧ず鍔犺浇鐘舵€?
- 鉁?娣诲姞閲嶈瘯鏈哄埗
- ✅ 设置合理的timeout10秒
- ✅ 前端显示加载状态
- ✅ 添加重试机制
### 风险3: Python执行失败
**应对措施**:
- 鉁?AI鑷<49>垜淇<E59E9C><E6B787>锛堟渶澶?娆★級
- 鉁?鍙嬪ソ閿欒<E996BF>鎻愮ず
- 鉁?寤鸿<E5AFA4>鐢ㄦ埛璋冩暣闇€姹?
- ✅ AI自我修正最多3次
- ✅ 友好错误提示
- ✅ 建议用户调整需求
---
## 📊 预期成果
**Day 3瀹屾垚鍚?*:
- 鉁?Tool C鐢ㄦ埛鍙<EFBFBD>€氳繃鑷<EFBFBD>劧璇<EFBFBD>█娓呮礂鏁版嵁
- 鉁?AI鑳界敓鎴?0%鍦烘櫙鐨勬<E990A8><EFBFBD>唬鐮?
- 鉁?澶辫触鍦烘櫙鏈夎嚜鍔ㄩ噸璇曟満鍒?
- 鉁?瀹屾暣鐨勫<E990A8>璇濆巻鍙茬<E98D99>鐞?
**Day 3完成后**:
- Tool C用户可通过自然语言清洗数据
- ✅ AI能生成90%场景的正确代码
- ✅ 失败场景有自动重试机制
- ✅ 完整的对话历史管理
**整体进度**:
- Day 1: Python<EFBFBD>湇鍔?鉁?
- Day 2: Session绠$悊 鉁?
- Day 1: Python微服务 ✅
- Day 2: Session管理 ✅
- Day 3: AI代码生成 ⏸️
- Day 4-5: 鍓嶇<EFBFBD>寮€鍙?
- Day 6: <EFBFBD>埌绔<EFBFBD>祴璇?
- Day 4-5: 前端开发
- Day 6: 端到端测试
---
## 📝 更新记录
| 鏃ユ湡 | 鐗堟湰 | 鏇存柊鍐呭<E98D90> | 鏇存柊浜?|
| 日期 | 版本 | 更新内容 | 更新人 |
|------|------|---------|--------|
| 2025-12-06 | V1.0 | 鍒濆<EFBFBD>鍒涘缓锛屾槑纭?澶у喅绛栧拰寮€鍙戣<E98D99>鍒?| AI Assistant |
| 2025-12-06 | V1.0 | 初始创建明确9大决策和开发计划 | AI Assistant |
---
**鏂囨。鐘舵€?*: 鉁?宸茬‘璁?
**涓嬩竴姝?*: 寮€濮嬫墽琛屽紑鍙戣<E98D99>鍒掞紙棰勮<E6A3B0>5.5-6灏忔椂锛?
**文档状态**: ✅ 已确认
**下一步**: 开始执行开发计划预计5.5-6小时
**准备开始开发!** 🚀
@@ -992,6 +992,5 @@ export const aiController = new AIController();