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,138 +1,138 @@
# Tool B - 病历结构化机器人 技术债务清单
> **鍒涘缓鏃ユ湡锛?* 2025-12-03
> **鐘舵€侊細** 寰呭<E5AFB0>鐞?
> **创建日期:** 2025-12-03
> **状态:** 待处理
> **优先级:** P1=高优先级, P2=中优先级, P3=低优先级
---
## 📋 技术债务列表
### **[P1] #1 - Excel瀵煎嚭涓庡墠绔<EFBFBD>樉绀虹粨鏋滀笉涓€鑷?*
### **[P1] #1 - Excel导出与前端显示结果不一致**
**<EFBFBD><EFBFBD>鎻忚堪锛?*
- 鐢ㄦ埛鍦ㄦ<EFBFBD>楠?浜ゅ弶楠岃瘉椤甸潰鐪嬪埌鐨勬彁鍙栫粨鏋滐紝涓庡<E6B693>鍑虹殑Excel鏂囦欢鍐呭<E98D90>涓嶄竴鑷?
- 鍒楅『搴忔贩涔憋紝閮ㄥ垎瀛楁<EFBFBD>缂哄け鎴栨暟鎹<EFBFBD>敊浣?
**问题描述:**
- 用户在步骤4交叉验证页面看到的提取结果与导出的Excel文件内容不一致
- 列顺序混乱,部分字段缺失或数据错位
**閲嶇幇姝ラ<EFBFBD>锛?*
**重现步骤:**
1. 完成双模型提取并进入步骤4
2. 点击"导出当前结果"或在步骤5点击"下载结果Excel"
3. 打开Excel对比前端显示的结果
**鏍规湰鍘熷洜锛?*
**根本原因:**
- JavaScript对象展开`...extractedData`时顺序不固定
- <EFBFBD>寜妯℃澘瀹氫箟鐨勫瓧娈甸『搴忔瀯寤篍xcel鍒?
- 未按模板定义的字段顺序构建Excel
**当前状态:**
- 鉁?宸查儴鍒嗕慨澶嶏細鎸塼argetFields椤哄簭瀵煎嚭
- 鉂?浠嶉渶楠岃瘉锛氬<E9949B>娆″<E5A886>鍑虹粨鏋滄槸鍚︾ǔ瀹氫竴鑷?
- ✅ 已部分修复按targetFields顺序导出
- ❌ 仍需验证:多次导出结果是否稳定一致
**喅鏂规<EFBFBD>锛?*
1. 涓ユ牸鎸夌収`task.targetFields`瀹氫箟鐨勫瓧娈甸『搴忓<EFBFBD>鍑?
**解决方案:**
1. 严格按照`task.targetFields`定义的字段顺序导出
2. 添加表头样式(加粗、冻结首行)
3. 娣诲姞鏁版嵁楠岃瘉锛堢‘淇濇墍鏈夊瓧娈甸兘瀛樺湪锛?
3. 添加数据验证(确保所有字段都存在)
4. 添加导出测试用例
**棰勮<EFBFBD>宸ユ椂锛?* 2灏忔椂
**褰卞搷鑼冨洿锛?* 鍚庣<E98D9A> ExtractionController.exportResults鏂规硶
**预计工时:** 2小时
**影响范围:** 后端 ExtractionController.exportResults方法
---
### **[P2] #2 - 姝ラ<EFBFBD>3杩涘害鏉℃樉绀轰笉澶熺粏鑵?*
### **[P2] #2 - 步骤3进度条显示不够细腻**
**<EFBFBD><EFBFBD>鎻忚堪锛?*
- 褰撳墠杩涘害鏉洿鎺ヤ粠0%璺冲埌100%锛岀己灏戜腑闂磋繃绋?
**问题描述:**
- 当前进度条直接从0%跳到100%,缺少中间过程
- 用户无法感知大模型正在处理第几条记录
- 娌℃湁瀹炴椂鍙嶉<EFBFBD>褰撳墠澶勭悊鐘舵€侊紙濡?姝e湪澶勭悊绗?/9鏉?锛?
- 没有实时反馈当前处理状态(如"正在处理第3/9条"
**鏈熸湜鏁堟灉锛?*
**期望效果:**
```
提取进度: 33% (3/9条已完成)
鏃ュ織杈撳嚭锛?
日志输出:
[13:43:12] 正在创建提取任务...
[13:43:12] 任务创建成功 (ID: xxx)
[13:43:12] 初始化双模型引擎 (DeepSeek-V3 & Qwen-Max)...
[13:43:13] [1/9] 姝e湪鎻愬彇: 銆愬彸鑲轰笅鍙躲€戞蹈娑︽€ц吅鐧?..
[13:43:18] [1/9] 鉁?鎻愬彇瀹屾垚 (DeepSeek: 549 tokens, Qwen: 627 tokens)
[13:43:19] [2/9] 姝e湪鎻愬彇: 銆愬彸鑲轰笂鍙躲€戞蹈娑︽€ц吅鐧?..
[13:43:24] [2/9] 鉁?鎻愬彇瀹屾垚 (DeepSeek: 486 tokens, Qwen: 551 tokens)
[13:43:13] [1/9] 正在提取: 【右肺下叶】浸润性腺癌...
[13:43:18] [1/9] ✅ 提取完成 (DeepSeek: 549 tokens, Qwen: 627 tokens)
[13:43:19] [2/9] 正在提取: 【右肺上叶】浸润性腺癌...
[13:43:24] [2/9] ✅ 提取完成 (DeepSeek: 486 tokens, Qwen: 551 tokens)
...
[13:43:30] PII 脱敏完成
[13:43:30] 鉁?鎵€鏈夎<E98F88>褰曟彁鍙栧畬鎴愶紒
[13:43:30] ✅ 所有记录提取完成!
```
**喅鏂规<EFBFBD>锛?*
**解决方案:**
**鍚庣<EFBFBD>鏀瑰姩锛?*
**后端改动:**
1.`DualModelExtractionService.batchExtract`的for循环中每处理完一条记录就更新进度
2. 添加`currentItem`字段到Task表可选用于实时显示当前处理的记录
3. 或者使用Redis存储实时进度信息更云原生
**鍓嶇<EFBFBD>鏀瑰姩锛?*
**前端改动:**
1. 轮询API时解析`processedCount``totalCount`
2. 动态生成日志:`[${processedCount}/${totalCount}] 正在提取...`
3. 杩涘害鏉″钩婊戣繃娓★紙CSS transition锛?
3. 进度条平滑过渡(CSS transition
**棰勮<EFBFBD>宸ユ椂锛?* 3灏忔椂
**褰卞搷鑼冨洿锛?*
**预计工时:** 3小时
**影响范围:**
- 后端DualModelExtractionService.batchExtract
- 前端Step3Processing.tsx
---
### **[P1] #3 - Excel鏂囦欢棰勫<EFBFBD>鐞嗕笌鑴忔暟鎹<EFBFBD>竻娲?*
### **[P1] #3 - Excel文件预处理与脏数据清洗**
**<EFBFBD><EFBFBD>鎻忚堪锛?*
鍖荤枟绉戠爺鍦烘櫙涓嬶紝Excel鏂囦欢璐ㄩ噺鍙傚樊涓嶉綈锛屽瓨鍦ㄥぇ閲忚剰鏁版嵁瀵艰嚧瑙瀽澶辫触鎴栫粨鏋滈敊璇<EFBFBD>€?
**问题描述:**
医疗科研场景下Excel文件质量参差不齐存在大量脏数据导致解析失败或结果错误。
#### **瀛愰棶棰?锛氳〃澶寸壒娈婂瓧绗?*
- **鐜拌薄锛?* 鍒楀悕鍖呭惈鎹㈣<E98EB9><EFBFBD>\n`銆佺┖鏍笺€佸埗琛ㄧ<E7909B>绛夛紝瀵艰嚧鍒楀悕鍖归厤澶辫触
- **绀轰緥锛?* `"鐥呬汉ID\n(Patient ID)"` 鈫?鍓嶇<E98D93>涓嬫媺妗嗘樉绀哄紓甯?
- **褰卞搷锛?* 鐢ㄦ埛鏃犳硶閫夋嫨姝g‘鐨勫垪
#### **子问题1表头特殊字符**
- **现象:** 列名包含换行符`\n`、空格、制表符等,导致列名匹配失败
- **示例:** `"病人ID\n(Patient ID)"` → 前端下拉框显示异常
- **影响:** 用户无法选择正确的列
#### **瀛愰棶棰?锛氬叕寮?(Formulas)**
- **鐜拌薄锛?* 鍗曞厓鏍煎寘鍚<E5AF98>叕寮廯=A1+B1`锛寈lsx搴撹<E690B4>鍙栨椂杩斿洖鍏<E6B496>紡鏂囨湰鑰岄潪璁畻缁撴灉
- **绀轰緥锛?*
#### **子问题2公式 (Formulas)**
- **现象:** 单元格包含公式`=A1+B1`xlsx库读取时返回公式文本而非计算结果
- **示例:**
- 原始值:`=SUM(A1:A10)`
- 璇诲彇缁撴灉锛氬瓧绗︿覆`"=SUM(A1:A10)"`锛堣€岄潪鏁板瓧锛?
- 澶栭儴寮曠敤锛歚=[澶栭儴鏂囦欢]Sheet1!A1` 鈫?`#REF!`
- **褰卞搷锛?* 鏁板€煎瀷瀛楁<E7809B>锛堝<E9949B>骞撮緞銆佽<E98A86>绯栧€硷級鍙樻垚鏂囨湰锛屾棤娉曠粺璁?
- 读取结果:字符串`"=SUM(A1:A10)"`(而非数字)
- 外部引用:`=[外部文件]Sheet1!A1``#REF!`
- **影响:** 数值型字段(如年龄、血糖值)变成文本,无法统计
#### **瀛愰棶棰?锛氬悎骞跺崟鍏冩牸 (Merged Cells)**
- **鐜拌薄锛?* 鍖荤敓涔犳儻鍚堝苟"浣忛櫌鍙?鍒楋紝瀵瑰簲澶氳<E6BEB6>鍖栭獙璁板綍
- **绀轰緥锛?*
#### **子问题3合并单元格 (Merged Cells)**
- **现象:** 医生习惯合并"住院号"列,对应多行化验记录
- **示例:**
```
浣忛櫌鍙? 妫€鏌ラ」鐩? 缁撴灉
H001 琛€甯歌<EFBFBD> 姝e父 鈫?鍙<>湁杩欒<E69DA9>鏈変綇闄㈠彿
(鍚堝苟) 鑲濆姛鑳? 寮傚父 鈫?杩欒<E69DA9>浣忛櫌鍙蜂负null
(鍚堝苟) 鑲惧姛鑳? 姝e父 鈫?杩欒<E69DA9>浣忛櫌鍙蜂负null
住院号 检查项目 结果
H001 血常规 正常 ← 只有这行有住院号
(合并) 肝功能 异常 ← 这行住院号为null
(合并) 肾功能 正常 ← 这行住院号为null
```
- **褰卞搷锛?* 鍚庣画琛岀殑鍏宠仈瀛楁<E7809B>涓㈠け锛屾棤娉曡拷婧<E68BB7>埌鎮€?
- **影响:** 后续行的关联字段丢失,无法追溯到患者
#### **瀛愰棶棰?锛氭棩鏈熷湴鐙?(Date Parsing Hell)**
- **鐜拌薄锛?* Excel鏃ユ湡瀛樺偍涓烘暟瀛楋紙Serial Number锛夛紝鎴栧<EFBFBD>绉嶆枃鏈<EFBFBD>牸寮?
- **绀轰緥锛?*
- `44927` 鈫?搴旇<E690B4>瀽涓?`2023-01-01`
#### **子问题4日期地狱 (Date Parsing Hell)**
- **现象:** Excel日期存储为数字(Serial Number),或多种文本格式
- **示例:**
- `44927` → 应该解析为 `2023-01-01`
- `2023.1.1`(文本)
- `2023骞?鏈?鏃<>锛堜腑鏂囷級
- `2023年1月1日`(中文)
- `Jan 1, 2023`(英文)
- **褰卞搷锛?* 鏃ユ湡瀛楁<E7809B>鏃犳硶鎺掑簭銆佺瓫閫夈€佺粺璁?
- **影响:** 日期字段无法排序、筛选、统计
#### **瀛愰棶棰?锛氫笉鍙<E7AC89><E98D99>瀛楃<E7809B>涓庤剰鏂囨湰 (Ghost Characters)**
- **鐜拌薄锛?* 鐪嬭捣鏉ユ槸"鐢?锛屽疄闄呭寘鍚<E5AF98>笉鍙<E7AC89><E98D99>瀛楃<E7809B>
- **绀轰緥锛?*
- `"鐢?"` (灏鹃儴绌烘牸)
#### **子问题5不可见字符与脏文本 (Ghost Characters)**
- **现象:** 看起来是"男",实际包含不可见字符
- **示例:**
- `"男 "` (尾部空格)
- `"男\u200b"` (零宽空格 Zero-Width Space)
- `"男\ufeff"` (BOM字符)
- **褰卞搷锛?* 鏉′欢鍒ゆ柇澶辫触锛歚if (sex === '鐢?)` 鈫?false
- **鍖诲<E98D96>鍦烘櫙鐗逛緥锛?*
- 鍖栭獙鍗曞<E98D97>鍒剁矘璐存椂甯﹀叆瀵屾枃鏈<E69E83>牸寮?
- **影响:** 条件判断失败:`if (sex === '男')` → false
- **医学场景特例:**
- 化验单复制粘贴时带入富文本格式
- 不同医院HIS系统导出编码不统一
**喅鏂规<EFBFBD>锛?*
**解决方案:**
#### **鏋舵瀯璁捐<EFBFBD>锛氱嫭绔嬬殑Excel棰勫<EFBFBD>鐞嗘湇鍔?*
#### **架构设计独立的Excel预处理服务**
```typescript
// backend/src/modules/dc/services/ExcelPreprocessor.ts
export class ExcelPreprocessor {
@@ -143,24 +143,24 @@ export class ExcelPreprocessor {
return headers.map(h => h
.replace(/[\n\r\t]/g, ' ') // 移除换行、制表符
.trim() // 去除首尾空格
.replace(/\s+/g, ' ') // 澶氫釜绌烘牸鍚堝苟涓轰竴涓?
.replace(/\s+/g, ' ') // 多个空格合并为一个
);
}
/**
* 澶勭悊鍏<EFBFBD>紡鍗曞厓鏍?
* 处理公式单元格
*/
processFormulas(worksheet: xlsx.WorkSheet): void {
// 浣跨敤 xlsx 鐨?{ cellFormula: false } 閫夐」
// 鎴栨墜鍔ㄩ亶鍘嗗崟鍏冩牸锛岃<EFBFBD>绠楀叕寮忕粨鏋?
// 使用 xlsx { cellFormula: false } 选项
// 或手动遍历单元格,计算公式结果
}
/**
* 灞曞紑鍚堝苟鍗曞厓鏍?
* 展开合并单元格
*/
unflattenMergedCells(worksheet: xlsx.WorkSheet): void {
// 1. 鎵惧埌鎵€鏈夊悎骞跺尯鍩?worksheet['!merges']
// 2. 灏嗕富鍗曞厓鏍肩殑鍊煎~鍏呭埌鎵€鏈夊瓙鍗曞厓鏍?
// 1. 找到所有合并区域 worksheet['!merges']
// 2. 将主单元格的值填充到所有子单元格
}
/**
@@ -168,7 +168,7 @@ export class ExcelPreprocessor {
*/
normalizeDates(value: any): string | null {
if (typeof value === 'number') {
// Excel Serial Number 鈫?ISO Date
// Excel Serial Number ISO Date
return this.excelSerialToDate(value);
}
if (typeof value === 'string') {
@@ -181,84 +181,84 @@ export class ExcelPreprocessor {
}
/**
* 娓呴櫎涓嶅彲瑙佸瓧绗?
* 清除不可见字符
*/
cleanInvisibleChars(text: string): string {
return text
.replace(/\u200b/g, '') // 零宽空格
.replace(/\ufeff/g, '') // BOM
.replace(/\u00a0/g, ' ') // 涓嶉棿鏂<EFBFBD>┖鏍?鈫?鏅<>€氱┖鏍?
.replace(/\u00a0/g, ' ') // 不间断空格 → 普通空格
.trim();
}
}
```
#### **浣跨敤浣嶇疆锛?*
1. **uploadFile API** - 涓婁紶鍚庣珛鍗抽<EFBFBD>澶勭悊锛岃繑鍥炴竻娲楀悗鐨勫垪鍚?
2. **healthCheck API** - 浣跨敤娓呮礂鍚庣殑鏁版嵁杩涜<EFBFBD>妫€鏌?
#### **使用位置:**
1. **uploadFile API** - 上传后立即预处理,返回清洗后的列名
2. **healthCheck API** - 使用清洗后的数据进行检查
3. **createTask API** - 使用清洗后的数据创建items
**棰勮<EFBFBD>宸ユ椂锛?* 16灏忔椂锛堝<E9949B>鏉傚害楂橈紝闇€瑕佸ぇ閲忔祴璇曪級
**褰卞搷鑼冨洿锛?*
- 鏂板<E98F82>锛歚ExcelPreprocessor.ts` (~400琛?
**预计工时:** 16小时复杂度高需要大量测试
**影响范围:**
- 新增:`ExcelPreprocessor.ts` (~400行)
- 修改:`ExtractionController.ts` 的文件处理逻辑
- 测试:覆盖各种脏数据场景
**渚濊禆锛?*
- xlsx搴撶殑楂樼骇鍔熻兘锛坈ellFormula銆?merges绛夛級
**依赖:**
- xlsx库的高级功能cellFormula、!merges等)
- dayjs或date-fns日期解析
---
### **[P2] #4 - <EFBFBD>寔鐢ㄦ埛鑷<EFBFBD>畾涔夋彁鍙栨ā鏉?*
### **[P2] #4 - 支持用户自定义提取模板**
**<EFBFBD><EFBFBD>鎻忚堪锛?*
褰撳墠绯荤粺鍙<EFBFBD>敮鎸?涓<><E6B693>璁炬ā鏉匡紙鑲虹檶鐥呯悊銆佺硸灏跨梾鍏ラ櫌銆侀珮琛€鍘嬮棬璇婏級锛屾棤娉曟弧瓒崇敤鎴风殑澶氭牱鍖栭渶姹傘€?
**问题描述:**
当前系统只支持3个预设模板肺癌病理、糖尿病入院、高血压门诊无法满足用户的多样化需求。
**需求场景:**
1. 绉戠爺浜哄憳鐮旂┒缃曡<E7BC83>鐥咃紙濡傦細绯荤粺鎬х孩鏂戠嫾鐤<E5ABBE>€侀噸鐥囪倢鏃犲姏锛?
2. 闇€瑕佹彁鍙栫殑瀛楁<E7809B>涓庨<E6B693>璁炬ā鏉夸笉鍚?
3. 姣忎釜鐮旂┒椤圭洰鐨勬暟鎹<E69A9F><E98EB9>鑼冨彲鑳戒笉鍚?
1. 科研人员研究罕见病(如:系统性红斑狼疮、重症肌无力)
2. 需要提取的字段与预设模板不同
3. 每个研究项目的数据规范可能不同
**鏈熸湜鍔熻兘锛?*
**期望功能:**
#### **1. 鍓嶇<EFBFBD>锛氳嚜瀹氫箟妯℃澘缂栬緫鍣?*
#### **1. 前端:自定义模板编辑器**
```
步骤2.1:选择模板来源
- [ ] 使用系统预设模板
- [x] 鍒涘缓鑷<EFBFBD>畾涔夋ā鏉?
- [x] 创建自定义模板
姝ラ<EFBFBD>2.2锛氬畾涔夋ā鏉夸俊鎭?
步骤2.2:定义模板信息
- 模板名称:[我的肺癌研究模板]
- 疾病类型:[自定义:系统性红斑狼疮]
- 报告类型:[自定义:实验室检查]
步骤2.3:定义提取字段(可视化编辑)
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹?瀛楁<E7809B>1: [鎶楁牳鎶椾綋婊村害] 鈹?
鈹?鎻忚堪: [濡?1:320, 1:640] 鈹?
鈹?瀹藉害: [w-32] 鈻? 鈹?
鈹?[ 鍒犻櫎 ] 鈹?
鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹?瀛楁<E7809B>2: [琛ヤ綋C3] 鈹?
鈹?鎻忚堪: [鍗曚綅g/L] 鈹?
鈹?[ 鍒犻櫎 ] 鈹?
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
┌─────────────────────────────────────┐
│ 字段1: [抗核抗体滴度]
│ 描述: [1:320, 1:640]
│ 宽度: [w-32]
│ [ 删除 ]
├─────────────────────────────────────┤
│ 字段2: [补体C3]
│ 描述: [单位g/L]
│ [ 删除 ]
└─────────────────────────────────────┘
[+ 添加字段]
姝ラ<EFBFBD>2.4锛欰I鐢熸垚Prompt锛堣嚜鍔ㄥ寲锛?
[ <EFBFBD> 璁〢I甯<49>垜鐢熸垚鎻愮ず璇?]
步骤2.4AI生成Prompt自动化
[ 🤖 让AI帮我生成提示词 ]
鍚庡彴鑷<EFBFBD>姩鐢熸垚锛?
后台自动生成:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
浣犳槸涓€鍚嶉<EFBFBD>婀垮厤鐤<EFBFBD><EFBFBD>涓撳<EFBFBD>銆傝<EFBFBD>浠庝互涓嬬郴缁熸€х孩鏂戠嫾鐤?
€呯殑瀹為獙瀹ゆ<EFBFBD>鏌ユ姤鍛婁腑鎻愬彇鍏抽敭淇℃伅銆?
你是一名风湿免疫科专家。请从以下系统性红斑狼疮
患者的实验室检查报告中提取关键信息。
鎻愬彇瀛楁<EFBFBD>锛堝繀椤昏繑鍥炰互涓嬫墍鏈夊瓧娈碉級锛?
提取字段(必须返回以下所有字段):
- 抗核抗体滴度:如 1:320, 1:640
- 补体C3单位g/L
**杈撳嚭鏍煎紡锛氫弗鏍肩殑JSON鏍煎紡锛?*
**输出格式严格的JSON格式**
```json
{
"抗核抗体滴度": "...",
@@ -273,7 +273,7 @@ export class ExcelPreprocessor {
#### **2. 后端模板管理API**
```typescript
// 新增API端点
POST /api/v1/dc/tool-b/templates // 鍒涘缓鑷<EFBFBD>畾涔夋ā鏉?
POST /api/v1/dc/tool-b/templates // 创建自定义模板
PUT /api/v1/dc/tool-b/templates/:id // 更新模板
DELETE /api/v1/dc/tool-b/templates/:id // 删除模板
GET /api/v1/dc/tool-b/templates/:id // 获取模板详情
@@ -282,10 +282,10 @@ GET /api/v1/dc/tool-b/templates/:id // 获取模板详情
POST /api/v1/dc/tool-b/templates/generate-prompt
Request:
{
"diseaseType": "绯荤粺鎬х孩鏂戠嫾鐤?,
"reportType": "瀹為獙瀹ゆ<EFBFBD>鏌?,
"diseaseType": "系统性红斑狼疮",
"reportType": "实验室检查",
"fields": [
{ "name": "鎶楁牳鎶椾綋婊村害", "desc": "濡?1:320, 1:640" },
{ "name": "抗核抗体滴度", "desc": "1:320, 1:640" },
{ "name": "补体C3", "desc": "单位g/L" }
]
}
@@ -299,27 +299,27 @@ Response:
#### **3. AI Prompt生成逻辑**
```typescript
// 浣跨敤鍏働rompt锛圡eta-Prompt锛?
// 使用元PromptMeta-Prompt
async generatePrompt(
diseaseType: string,
reportType: string,
fields: { name: string; desc: string }[]
): Promise<string> {
const metaPrompt = `
浣犳槸涓€鍚嶅尰瀛<EFBFBD>I Prompt宸ョ▼甯堛€傝<E282AC>涓虹梾鍘嗙粨鏋勫寲鎻愬彇浠诲姟鐢熸垚涓撲笟鐨勬彁绀鸿瘝銆?
你是一名医学AI Prompt工程师。请为病历结构化提取任务生成专业的提示词。
浠诲姟鑳屾櫙锛?
- 鐤剧梾绫诲瀷锛?{diseaseType}
- 鎶ュ憡绫诲瀷锛?{reportType}
任务背景:
- 疾病类型:${diseaseType}
- 报告类型:${reportType}
鎻愬彇瀛楁<EFBFBD>锛?
${fields.map((f, i) => `${i + 1}. ${f.name}锛?{f.desc}`).join('\n')}
提取字段:
${fields.map((f, i) => `${i + 1}. ${f.name}${f.desc}`).join('\n')}
瑕佹眰锛?
要求:
1. 模拟该疾病领域的专家角色
2. 娓呮櫚璇存槑姣忎釜瀛楁<E7809B>鐨勬彁鍙栬<E98D99>鍒?
2. 清晰说明每个字段的提取规则
3. 要求输出严格的JSON格式
4. 澶勭悊"鏈<>彁鍙?鐨勬儏鍐?
4. 处理"未提及"的情况
请生成完整的Prompt。`;
@@ -334,104 +334,103 @@ ${fields.map((f, i) => `${i + 1}. ${f.name}
```
**技术亮点:**
- 鉁?**Prompt鍗充唬鐮侊紙Prompt-as-Code锛?*锛氭ā鏉垮彲鐗堟湰鎺у埗銆丄/B娴嬭瘯
- 鉁?**AI鐢熸垚AI鐨凱rompt锛圡eta-Prompt锛?*锛氶檷浣庣敤鎴烽棬妲?
- 鉁?**妯℃澘甯傚満锛堟湭鏉ワ級**锛氱敤鎴峰彲鍒嗕韩銆佷笅杞戒紭璐ㄦā鏉?
- ✨ **Prompt即代码(Prompt-as-Code**模板可版本控制、A/B测试
- ✨ **AI生成AI的PromptMeta-Prompt**:降低用户门槛
- ✨ **模板市场(未来)**:用户可分享、下载优质模板
**棰勮<EFBFBD>宸ユ椂锛?* 12灏忔椂
**褰卞搷鑼冨洿锛?*
- 鏂板<E98F82>锛歚CustomTemplateService.ts` (~300琛?
- 鏂板<E98F82>锛歚PromptGeneratorService.ts` (~200琛?
**预计工时:** 12小时
**影响范围:**
- 新增:`CustomTemplateService.ts` (~300行)
- 新增:`PromptGeneratorService.ts` (~200行)
- 前端Step2Schema.tsx 新增自定义模板编辑UI
- 数据库DCTemplate表已支持无需改动
---
## 馃搳 浼樺厛绾ц瘎浼?
## 📊 优先级评估
| 鍊哄姟ID | <EFBFBD><EFBFBD> | 浼樺厛绾?| 宸ユ椂 | 褰卞搷鐢ㄦ埛 | 鎶€鏈<E282AC><E98F88>闄?|
| 债务ID | 问题 | 优先级 | 工时 | 影响用户 | 技术风险 |
|--------|------|--------|------|----------|----------|
| #1 | Excel瀵煎嚭涓嶄竴鑷?| P1 | 2h | 楂橈紙鏍稿績鍔熻兘锛?| 浣?|
| #2 | 杩涘害鏉℃樉绀轰紭鍖?| P2 | 3h | <EFBFBD>紙浣撻獙浼樺寲锛?| 浣?|
| #3 | Excel棰勫<EFBFBD>鐞?| P1 | 16h | 楂橈紙鏁版嵁璐ㄩ噺锛?| 涓?|
| #4 | <EFBFBD>畾涔夋ā鏉?| P2 | 12h | <EFBFBD>紙鎵╁睍鎬э級 | 涓?|
| #1 | Excel导出不一致 | P1 | 2h | 高(核心功能) | 低 |
| #2 | 进度条显示优化 | P2 | 3h | 中(体验优化) | 低 |
| #3 | Excel预处理 | P1 | 16h | 高(数据质量) | 中 |
| #4 | 自定义模板 | P2 | 12h | 中(扩展性) | |
**鎬昏<EFBFBD>锛?* 33灏忔椂锛堢害4涓<34>伐浣滄棩锛?
**总计:** 33小时约4个工作日
---
## 🎯 建议处理顺序
### **Sprint 1锛氭牳蹇冨姛鑳戒慨澶嶏紙P1浼樺厛锛?*
1. 鉁?#1 - Excel瀵煎嚭淇<EFBFBD><EFBFBD>锛?灏忔椂锛夆啋 **绔嬪嵆澶勭悊**
2. #3 - Excel棰勫<EFBFBD>鐞嗭紙16灏忔椂锛夆啋 **鍒嗛樁娈靛疄鐜?*
- Phase 1锛氳〃澶存竻娲楋紙2灏忔椂锛?
- Phase 2锛氬悎骞跺崟鍏冩牸灞曞紑锛?灏忔椂锛?
- Phase 3锛氬叕寮忓<EFBFBD>鐞嗭紙3灏忔椂锛?
- Phase 4锛氭棩鏈熺粺涓€锛?灏忔椂锛?
- Phase 5锛氫笉鍙<EFBFBD><EFBFBD>瀛楃<EFBFBD>娓呯悊锛?灏忔椂锛?
- Phase 6锛氶泦鎴愭祴璇曪紙2灏忔椂锛?
### **Sprint 1核心功能修复P1优先**
1. ✅ #1 - Excel导出修复2小时→ **立即处理**
2. #3 - Excel预处理16小时→ **分阶段实现**
- Phase 1表头清洗2小时
- Phase 2合并单元格展开4小时
- Phase 3公式处理3小时
- Phase 4日期统一3小时
- Phase 5不可见字符清理2小时
- Phase 6集成测试2小时
### **Sprint 2锛氫綋楠屼紭鍖栵紙P2锛?*
1. #2 - 杩涘害鏉紭鍖栵紙3灏忔椂锛?
2. #4 - <EFBFBD>畾涔夋ā鏉匡紙12灏忔椂锛?
- Phase 1锛氬悗绔<EFBFBD>ā鏉緾RUD锛?灏忔椂锛?
- Phase 2锛歅rompt<EFBFBD>姩鐢熸垚锛?灏忔椂锛?
- Phase 3锛氬墠绔<EFBFBD>ā鏉跨紪杈戝櫒锛?灏忔椂锛?
### **Sprint 2体验优化P2**
1. #2 - 进度条优化3小时
2. #4 - 自定义模板12小时
- Phase 1后端模板CRUD4小时
- Phase 2Prompt自动生成4小时
- Phase 3前端模板编辑器4小时
---
## 💡 长期优化建议
### **1. 数据质量评分系统**
涓轰笂浼犵殑Excel鏂囦欢鎵撳垎锛?-100鍒嗭級锛?
- 鉁?90-100锛氫紭璐ㄦ暟鎹<E69A9F>紝鐩存帴澶勭悊
为上传的Excel文件打分0-100分
- ✅ 90-100优质数据直接处理
- ⚠️ 60-89一般质量提示可能问题
- 鉂?0-59锛氫綆璐ㄩ噺锛屽己鍒惰<E98D92>姹傜敤鎴锋竻娲楀悗鍐嶄笂浼?
- ❌ 0-59低质量强制要求用户清洗后再上传
### **2. Excel妯℃澘鏍囧噯鍖?*
鎻愪緵鏍囧噯Excel妯℃澘涓嬭浇锛岀敤鎴锋寜妯℃澘濉<EFBFBD>啓锛屽噺灏戣剰鏁版嵁锛?
### **2. Excel模板标准化**
提供标准Excel模板下载用户按模板填写减少脏数据
```
鐥呭巻缁撴瀯鍖栨爣鍑嗘ā鏉?v1.0.xlsx
- 琛ㄥご琛屽喕缁?
- 鏁版嵁楠岃瘉锛堜笅鎷夋<EFBFBD>锛?
病历结构化标准模板 v1.0.xlsx
- 表头行冻结
- 数据验证(下拉框)
- 字段说明(批注)
- 示例数据
```
### **3. 智能修复建议**
妫€娴嬪埌闂<EFBFBD><EFBFBD>鏃讹紝AI缁欏嚭淇<EFBFBD><EFBFBD>寤鸿<EFBFBD>锛?
检测到问题时AI给出修复建议
```
鈿狅笍 妫€娴嬪埌22涓<32>悎骞跺崟鍏冩牸锛屽彲鑳藉<E991B3>鑷存暟鎹<E69A9F>涪澶?
寤鸿<EFBFBD>鎿嶄綔锛?
[ <EFBFBD>姩灞曞紑鍚堝苟鍗曞厓鏍?] [ 蹇界暐骞剁户缁?]
⚠️ 检测到22个合并单元格可能导致数据丢失
建议操作:
[ 自动展开合并单元格 ] [ 忽略并继续 ]
```
---
## 馃摑 寮€鍙戣<E98D99>褰?
## 📝 开发记录
| 鏃ユ湡 | 澶勭悊鍐呭<E98D90> | 鐘舵€?| 澶囨敞 |
| 日期 | 处理内容 | 状态 | 备注 |
|------|---------|------|------|
| 2025-12-03 | 鍒涘缓鎶€鏈<EFBFBD>€哄姟鏂囨。 | 鉁?| 鍒濆<E98D92>璁板綍4涓<34>棶棰?|
| 2025-12-03 | #1 Excel瀵煎嚭椤哄簭淇<EFBFBD><EFBFBD> | 馃攧 | 宸蹭慨鏀逛唬鐮侊紝寰呴獙璇?|
| - | #2 杩涘害鏉′紭鍖?| 鈴革笍 | 寰呭紑鍙?|
| - | #3 Excel棰勫<EFBFBD>鐞?| 鈴革笍 | 寰呭紑鍙?|
| - | #4 <EFBFBD>畾涔夋ā鏉?| 鈴革笍 | 寰呭紑鍙?|
| 2025-12-03 | 创建技术债务文档 | ✅ | 初始记录4个问题 |
| 2025-12-03 | #1 Excel导出顺序修复 | 🔄 | 已修改代码,待验证 |
| - | #2 进度条优化 | ⏸️ | 待开发 |
| - | #3 Excel预处理 | ⏸️ | 待开发 |
| - | #4 自定义模板 | ⏸️ | 待开发 |
---
## 🔗 相关文档
- [鎶€鏈<EFBFBD><EFBFBD>璁℃枃妗細宸ュ叿 B](../02-鎶€鏈<E282AC><E98F88>璁?鎶€鏈<E282AC><E98F88>璁℃枃妗細宸ュ叿%20B%20-%20鐥呭巻缁撴瀯鍖栨満鍣ㄤ汉%20(The%20AI%20Structurer).md)
- [API璁捐<EFBFBD>鏂囨。](../02-鎶€鏈<EFBFBD><EFBFBD>璁?API璁捐<E79281>鏂囨。-DC妯″潡锛堝畬鏁寸増锛?md)
- [寮€鍙戣<EFBFBD>鍒抅(../04-寮€鍙戣<E98D99>鍒?DC妯″潡Tool-B寮€鍙戣<E98D99>鍒?md)
- [浜戝師鐢熷紑鍙戣<EFBFBD>鑼僝(../../../04-寮€鍙戣<E98D99>鑼?08-浜戝師鐢熷紑鍙戣<E98D99>鑼?md)
- [技术设计文档:工具 B](../02-技术设计/技术设计文档:工具%20B%20-%20病历结构化机器人%20(The%20AI%20Structurer).md)
- [API设计文档](../02-技术设计/API设计文档-DC模块完整版.md)
- [开发计划](../04-开发计划/DC模块Tool-B开发计划.md)
- [云原生开发规范](../../../04-开发规范/08-云原生开发规范.md)
---
**鏂囨。缁存姢锛?* 姣忔<E5A7A3>澶勭悊鎶€鏈<E282AC>€哄姟鏃舵洿鏂版<E98F82>鏂囨。
**文档维护:** 每次处理技术债务时更新此文档