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

@@ -4,15 +4,16 @@
| :---- | :---- |
| **对应 PRD** | **PRD\_总体\_医疗科研智能数据清洗平台.md** |
| **版本** | **V1.0** |
| **<EFBFBD><EFBFBD>?* | Final Draft |
| **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>** | 蝖桃<EFBFBD>撟喳蝱<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>璇喟<EFBFBD><EFBFBD>𡁶鍂璅<EFBFBD>銝𦒘<EFBFBD><EFBFBD>冽芋<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>航器<EFBFBD><EFBFBD><EFBFBD><EFBFBD>紡憭𡁜𣪧<EFBFBD>笔僎銵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?|
| **状态** | Final Draft |
| **核心目标** | 确立平台的统一技术标准,梳理通用模块与专用模块的技术边界,指导多团队并行开发。 |
## **1\. <EFBFBD><EFBFBD>蝟餌<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?(System Architecture)**
## **1\. 总体系统架构图 (System Architecture)**
平台采用 **“微服务化单体 (Modular Monolith)”** 或 **“BFF \+ Worker”** 架构。前端统一入口,后端按功能拆分服务或模块。
撟喳蝱<EFBFBD><EFBFBD>**<EFBFBD>𨅯凝<EFBFBD>滚𦛚<EFBFBD><EFBFBD>雿?(Modular Monolith)<29>?* <20>?**<2A>輶FF \+ Worker<65>?* <20><EFBFBD><E59786><EFBFBD><EFBFBD>蝡舐<E89DA1><EFBFBD><E98A9D>亙藁嚗<E89781><E59A97>蝡舀<E89DA1><E88880><EFBFBD><E8A098><EFBFBD><EFBFBD><EFBFBD>滚𦛚<E6BB9A>𡝗芋<F0A19D97>𨰜<EFBFBD>?
graph TD
subgraph Client\_Layer \[<EFBFBD>滨垢鈭支<EFBFBD>撅?(Browser)\]
Portal\[撌乩<EFBFBD><EFBFBD>?(Portal)\]
subgraph Client\_Layer \[前端交互层 (Browser)\]
Portal\[工作台 (Portal)\]
ToolA\_UI\[工具A: 超级合并器\]
ToolB\_UI\[工具B: 结构化机器人\]
ToolC\_UI\[工具C: 科研编辑器\]
@@ -47,89 +48,93 @@ graph TD
ToolC\_UI \--Local First--\> IndexedDB\[(Browser DB)\]
ToolC\_UI \--快照同步--\> BFF
## **2\. <EFBFBD>𡁶鍂<EFBFBD><EFBFBD><EFBFBD>臬抅摨?(The Common Foundation)**
## **2\. 通用技术基座 (The Common Foundation)**
餈䠷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>韐舐忽<EFBFBD><EFBFBD><EFBFBD>㗇芋<EFBFBD><EFBFBD><EFBFBD>臬𣪧<EFBFBD><EFBFBD>憿餌<EFBFBD><EFBFBD><EFBFBD>萄儐<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
### **2.1 <20>滨垢<E6BBA8>𡁶鍂<F0A181B6>?(Frontend Core)**
这部分技术栈贯穿所有模块,是团队必须统一遵循的标准。
### **2.1 前端通用栈 (Frontend Core)**
| 组件 | 选型 | 说明 |
| :---- | :---- | :---- |
| **<EFBFBD>** | **React 19** | <EFBFBD>拍鍂<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Hooks <20><><EFBFBD>𤑳鸌<F0A491B3><EFBFBD>?|
| **<EFBFBD><EFBFBD>遣撌亙<EFBFBD>** | **Vite 5.x** | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>撱綽<EFBFBD><EFBFBD><EFBFBD> HMR<EFBFBD>?|
| **霂剛<EFBFBD>** | **TypeScript 5.x** | 撘箏<EFBFBD>撘箇掩<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝡臬<EFBFBD>鈭怎掩<EFBFBD><EFBFBD>銋?(shared-types)<EFBFBD>?|
| **<EFBFBD><EFBFBD>摨?* | **Tailwind CSS** | 蝏煺<EFBFBD> UI 憌擧聢嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?|
| **<EFBFBD><EFBFBD>摨?* | **Lucide React** | 憌擧聢蝏煺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>讐漣 SVG <20><EFBFBD><E69AB9>?|
| **頝舐眏** | **React Router v6** | 蝞∠<EFBFBD> Portal 銝𤾸<EFBFBD>銝?Tool 銋钅𡢿<E99285><F0A1A2BF><EFBFBD><EFBFBD>憟𨰜<E6869F>?|
| **<EFBFBD>唳旿霂瑟<EFBFBD>** | **SWR** <EFBFBD>?**TanStack Query** | <EFBFBD><EFBFBD> API 霂瑟<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摮塩<EFBFBD><EFBFBD><EFBFBD>𠹺遙<EFBFBD>∠𠶖<EFBFBD><EFBFBD><EFBFBD>**頧株砭 (Polling)**<EFBFBD>?|
| **框架** | **React 19** | 利用最新的 Hooks 和并发特性。 |
| **构建工具** | **Vite 5.x** | 极速构建,支持 HMR|
| **语言** | **TypeScript 5.x** | 强制强类型,前后端共享类型定义 (shared-types)|
| **样式库** | **Tailwind CSS** | 统一 UI 风格,快速开发。 |
| **图标库** | **Lucide React** | 风格统一的轻量级 SVG 图标。 |
| **路由** | **React Router v6** | 管理 Portal 与各个 Tool 之间的路由嵌套。 |
| **数据请求** | **SWR** **TanStack Query** | 处理 API 请求、缓存、以及任务状态的**轮询 (Polling)**|
### **2.2 <EFBFBD>𡒊垢<EFBFBD>𡁶鍂<EFBFBD>?(Backend Core)**
### **2.2 后端通用栈 (Backend Core)**
| 组件 | 选型 | 说明 |
| :---- | :---- | :---- |
| **餈鞱<EFBFBD><EFBFBD>?* | **Node.js 22 (LTS)** | 靽脲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?LTS <20><>𧋦<EFBFBD>?|
| **Web <EFBFBD>** | **Fastify 5.x** | 擃䀹<EFBFBD><EFBFBD>嚗䔶<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗玺chema <20><EFBFBD><E28ABF>见末<E8A781>?|
| **ORM** | **Prisma 6** | 蝐餃<EFBFBD>摰匧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗峕𣈲<EFBFBD>?Schema Migration<EFBFBD>?|
| **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>** | **Zod** | 餈鞱<EFBFBD><EFBFBD>?Schema <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TypeScript 蝐餃<EFBFBD><EFBFBD>?|
| **<EFBFBD><EFBFBD>** | **Winston / Pino** | 蝏𤘪<EFBFBD><EFBFBD>?JSON <20><EFBFBD><E4BA99>?|
| **运行时** | **Node.js 22 (LTS)** | 保持最新 LTS 版本。 |
| **Web 框架** | **Fastify 5.x** | 高性能低开销Schema 校验友好。 |
| **ORM** | **Prisma 6** | 类型安全的数据库操作,支持 Schema Migration|
| **参数校验** | **Zod** | 运行时 Schema 校验,可生成 TypeScript 类型。 |
| **日志** | **Winston / Pino** | 结构化 JSON 日志。 |
### **2.3 <EFBFBD><EFBFBD>霈暹鴌<EFBFBD>?(Infrastructure)**
### **2.3 基础设施栈 (Infrastructure)**
| 组件 | 选型 | 说明 |
| :---- | :---- | :---- |
| **<EFBFBD>唳旿摨?* | **PostgreSQL 15** | 摮睃<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鈭批<EFBFBD><EFBFBD>唳旿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝏𤘪<EFBFBD> (JSONB)<EFBFBD>?|
| **蝻枏<EFBFBD>/<2F><EFBFBD>** | **Redis 7** | 餈䠷<EFBFBD><EFBFBD>?Redis <EFBFBD><EFBFBD>蝻枏<EFBFBD>嚗䔶<EFBFBD><EFBFBD>?**BullMQ** <20><><EFBFBD>蝡胯<E89DA1>?|
| **<EFBFBD><EFBFBD>辣摮睃<EFBFBD>** | **MinIO / AWS S3** | 摮睃<EFBFBD><EFBFBD><EFBFBD>銝𠹺<EFBFBD><EFBFBD>?Excel<EFBFBD><EFBFBD>DF 隞亙<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞嗚<EFBFBD>?|
| **数据库** | **PostgreSQL 15** | 存储用户、任务、资产元数据、结构化结果 (JSONB)|
| **缓存/队列** | **Redis 7** | 这里的 Redis 既做缓存,也是 **BullMQ** 的后端。 |
| **文件存储** | **MinIO / AWS S3** | 存储用户上传的 Excel、PDF 以及生成的中间文件。 |
## **3\. 模块专用技术栈 (Module-Specific Stack)**
<EFBFBD><EFBFBD>笆銝滚<EFBFBD><EFBFBD>箸艶<EFBFBD><EFBFBD>鸌畾𢠃<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞嗚<EFBFBD>?
### **3.1 撌亙<E6928C> A嚗朞<E59A97>蝥批<E89DA5>撟嗅膥 (IO 撖<><E69296><EFBFBD>?**
针对不同场景的特殊需求,各工具引入了特定的技术组件。
*<2A><EFBFBD><E8A9A8><EFBFBD>嚗𡁜之<F0A1819C><E4B98B>辣瘚<E8BEA3><E7989A><EFBFBD><E686AD><EFBFBD><EFBFBD>𠯫<EFBFBD>蠘圾<E8A098><EFBFBD><E58390><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
### **3.1 工具 A超级合并器 (IO 密集型)**
*核心挑战:大文件流式处理、日期解析、哈希匹配。*
| 领域 | 专用组件 | 选型理由 |
| :---- | :---- | :---- |
| **<EFBFBD>𡒊垢 (Excel)** | **ExcelJS** | <EFBFBD><EFBFBD> SheetJS<EFBFBD><EFBFBD>撖?**Stream (瘚?** <20><>𣈲<EFBFBD><F0A388B2>凒憟踝<E6869F><E8B89D><EFBFBD><E8B3A2><EFBFBD><EFBFBD><EFBFBD><E9A488>摮㗛<E691AE><E3979B><EFBFBD>憭扳<E686AD>隞嗚<E99A9E>?|
| **<EFBFBD>𡒊垢 (Date)** | **Day.js \+ CustomParseFormat** | <EFBFBD><EFBFBD> Excel <EFBFBD><EFBFBD><EFBFBD><EFBFBD>𠯫<EFBFBD><EFBFBD>聢撘?(44927, 2023/1/1)嚗諹蝠<EFBFBD><EFBFBD>撘箏之<EFBFBD>?|
| **<EFBFBD><EFBFBD><EFBFBD>** | **BullMQ** | <EFBFBD><EFBFBD><EFBFBD>埈𧒄<EFBFBD><EFBFBD>僎隞餃𦛚嚗峕𣈲<EFBFBD><EFBFBD><EFBFBD>摨行<EFBFBD><EFBFBD><EFBFBD>?|
| **<EFBFBD>滨垢蝏<EFBFBD>** | **Ant Design Steps / Upload** | 敹恍<EFBFBD><EFBFBD><EFBFBD><EFBFBD>撖澆<EFBFBD> UI<EFBFBD>?|
| **后端 (Excel)** | **ExcelJS** | 相比 SheetJS,它对 **Stream (流)** 的支持更好,能处理超过内存限制的大文件。 |
| **后端 (Date)** | **Day.js \+ CustomParseFormat** | 解决 Excel 杂乱的日期格式 (44927, 2023/1/1),轻量且强大。 |
| **异步队列** | **BullMQ** | 处理耗时合并任务,支持进度汇报。 |
| **前端组件** | **Ant Design Steps / Upload** | 快速实现向导式 UI|
### **3.2 撌亙<EFBFBD> B嚗𡁶<E59A97><F0A181B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>箏膥鈭?(API/霈∠<E99C88><EFBFBD><E69296><EFBFBD>?**
### **3.2 工具 B病历结构化机器人 (API/计算密集型)**
*<2A><EFBFBD><E8A9A8><EFBFBD>嚗匁LM 蝻𡝗<E89DBB><F0A19D97><EFBFBD><EFBFBD><E79285>撟嗅<E6929F><E59785><EFBFBD><EFBFBD><EFBFBD><EFBFBD>撖嫘<E69296>?
*核心挑战LLM 编排、双模型并发、文本比对。*
| 领域 | 专用组件 | 选型理由 |
| :---- | :---- | :---- |
| **<EFBFBD>𡒊垢 (AI)** | **LangChain.js** | 蝏煺<EFBFBD> DeepSeek <EFBFBD>?Qwen <EFBFBD><EFBFBD><EFBFBD><EFBFBD>冽𦻖<EFBFBD><EFBFBD><EFBFBD>蝞∠<EFBFBD> Prompt Template<EFBFBD>?|
| **<EFBFBD>𡒊垢 (Diff)** | **diff-match-patch** (Google) | 霈∠<EFBFBD>銝支葵璅<EFBFBD>颲枏枂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>砍榆撘<EFBFBD><EFBFBD><EFBFBD>𤥁<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>擃䀝漁雿滨蔭<EFBFBD>?|
| **<EFBFBD>𡒊垢 (瘥𥪜笆)** | **Lodash / Dice Coefficient** | <EFBFBD><EFBFBD> JSON 撖寡情<EFBFBD><EFBFBD>楛撅<EFBFBD><EFBFBD>撖孵<EFBFBD>摮㛖泵銝脩㮾隡澆漲霈∠<EFBFBD><EFBFBD>?|
| **<EFBFBD>滨垢 (Grid)** | **TanStack Table** (Headless) | <EFBFBD>牐蛹<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摨血<EFBFBD><EFBFBD><EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI (撌血𢰧撟嗆<E6929F><E59786>厰僼)嚗峵eadless 摨𤘪<EFBFBD> AntD Table <EFBFBD><EFBFBD>瘣颯<EFBFBD>?|
| **后端 (AI)** | **LangChain.js** | 统一 DeepSeek Qwen 的调用接口,管理 Prompt Template|
| **后端 (Diff)** | **diff-match-patch** (Google) | 计算两个模型输出的文本差异,或者原文的高亮位置。 |
| **后端 (比对)** | **Lodash / Dice Coefficient** | 用于 JSON 对象的深层比对和字符串相似度计算。 |
| **前端 (Grid)** | **TanStack Table** (Headless) | 因为需要高度定制“冲突单元格”的 UI (左右并排按钮)Headless 库比 AntD Table 更灵活。 |
### **3.3 撌亙<EFBFBD> C嚗𡁶<E59A97><F0A181B6>娍㺭<E5A88D><EFBFBD>颲穃膥 (鈭支<E988AD><EFBFBD><E69296><EFBFBD>?**
### **3.3 工具 C科研数据编辑器 (交互密集型)**
*<2A><EFBFBD><E8A9A8><EFBFBD>嚗𡁜<E59A97>蝡舫<E89DA1><E888AB><EFBFBD>皜脫<E79A9C><E884AB><EFBFBD>𧋦<EFBFBD>啗恣蝞𨰜<E89D9E><F0A8B09C><EFBFBD><E4BC83><EFBFBD><EFBFBD><E6BB9A>?
*核心挑战:前端高性能渲染、本地计算、撤销重做。*
| 领域 | 专用组件 | 选型理由 |
| :---- | :---- | :---- |
| **<EFBFBD>滨垢 (Grid)** | **AG Grid Community** | **<EFBFBD><EFBFBD><EFBFBD>辣**<2A><>𣈲銝<F0A388B2><E98A9D><EFBFBD>韐寞𣈲<E5AF9E><F0A388B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E585B7><EFBFBD><EFBFBD>𡝗嗻<F0A19D97><E597BB>xcel 蝥找漱鈭垍<E988AD>摨瓐<E691A8>?|
| **<EFBFBD>滨垢 (Storage)** | **Dexie.js (IndexedDB)** | **Local-First <EFBFBD><EFBFBD><EFBFBD><EFBFBD>**<EFBFBD><EFBFBD>銁瘚讛<EFBFBD><EFBFBD>函垢摮睃<EFBFBD> 5-10 銝<><E98A9D><EFBFBD>唳旿嚗屸<E59A97><E5B1B8><EFBFBD><EFBFBD><E89D9C>蝏𡏭窈瘙<E7AA88><E79899>?|
| **<EFBFBD>滨垢 (State)** | **Zustand \+ Immer** | <EFBFBD>拍鍂 Immer <EFBFBD>?Patches <EFBFBD><EFBFBD>摰䂿緵 **Undo/Redo (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)** <EFBFBD><EFBFBD><EFBFBD>?|
| **<EFBFBD>滨垢 (Calc)** | **Math.js** | <EFBFBD><EFBFBD> JS 瘚桃<EFBFBD><EFBFBD>啁移摨阡䔮憸矋<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>颲枏<EFBFBD><EFBFBD><EFBFBD>龫摮血<EFBFBD>撘?(ln, pow)<EFBFBD>?|
| **<EFBFBD>滨垢 (Chart)** | **Ant Design Charts (G2)** | <EFBFBD>冽惣<EFBFBD>賭儒颲寞<EFBFBD>銝剔<EFBFBD><EFBFBD>嗥凒<EFBFBD>孵㦛<EFBFBD><EFBFBD><EFBFBD>?|
| **前端 (Grid)** | **AG Grid Community** | **核心组件**。唯一能免费支持虚拟滚动、列拖拽、Excel 级交互的库。 |
| **前端 (Storage)** | **Dexie.js (IndexedDB)** | **Local-First 架构核心**。在浏览器端存储 5-10 万行数据,避免频繁网络请求。 |
| **前端 (State)** | **Zustand \+ Immer** | 利用 Immer Patches 功能实现 **Undo/Redo (撤销重做)** 栈。 |
| **前端 (Calc)** | **Math.js** | 解决 JS 浮点数精度问题,解析用户输入的医学公式 (ln, pow)|
| **前端 (Chart)** | **Ant Design Charts (G2)** | 在智能侧边栏中绘制直方图和频次图。 |
## **4\. 数据交互标准 (Data Standards)**
銝箔<EFBFBD><EFBFBD><EFBFBD>?A \-\> B \-\> C <EFBFBD><EFBFBD><EFBFBD>頧穿<EFBFBD><EFBFBD>◆摰帋<EFBFBD>蝏煺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>桐漱<EFBFBD>聢撘譌<EFBFBD>?
为了打通 A \-\> B \-\> C 的流转,必须定义统一的数据交换格式。
### **4.1 内部流转格式**
* **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?* 蝏煺<E89D8F>雿輻鍂 **CSV (UTF-8 with BOM)** <EFBFBD>?**JSON Lines (.jsonl)**<2A>?
* *<EFBFBD><EFBFBD>眏嚗? Stream <EFBFBD><EFBFBD><EFBFBD><EFBFBD>敹恬<EFBFBD>銝𥪯<EFBFBD>靘肽<EFBFBD> Excel 憭齿<E686AD><E9BDBF>?XML 蝏𤘪<E89D8F><F0A498AA>?
* **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?* <20><><EFBFBD>匧極<E58CA7>瑚漣<E7919A><EFBFBD><E7AE87><EFBFBD><EFBFBD><E59A97>憿餃<E686BF><EFBFBD><E98A9D>碶蛹 YYYY-MM-DD 摮㛖泵銝脯<EFBFBD>?
* **蝛箏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>** 蝏煺<E89D8F>銝?null (JSON) <EFBFBD>?"" (CSV)嚗䔶艇蝳<EFBFBD><EFBFBD>?"NA", "-"<EFBFBD>?
* **文件物理格式:** 统一使用 **CSV (UTF-8 with BOM)** **JSON Lines (.jsonl)**
* *理由:* Stream 处理最快,且不依赖 Excel 复杂的 XML 结构。
* **日期标准:** 所有工具产出的日期,必须归一化为 YYYY-MM-DD 字符串。
* **空值标准:** 统一为 null (JSON) "" (CSV),严禁使用 "NA", "-"
### **4.2 API 响应结构 (Standard Response)**
interface ApiResponse\<T\> {
code: number; // 0: <EFBFBD>𣂼<EFBFBD>, \>0: <EFBFBD>躰秤<EFBFBD>?
code: number; // 0: 成功, \>0: 错误码
data: T; // 业务数据
message?: string; // 错误提示
meta?: { // 分页或元数据
@@ -140,8 +145,8 @@ interface ApiResponse\<T\> {
## **5\. 开发环境与部署 (DevOps)**
* **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>** **pnpm** (<EFBFBD><EFBFBD>嚗諹<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>条征<EFBFBD><EFBFBD>摰㕑<EFBFBD>敹?<3F>?
* **Monorepo (<EFBFBD><EFBFBD>?嚗?* 撱箄悅雿輻鍂 Turborepo <EFBFBD>?Nx 蝞∠<EFBFBD> frontend, backend-api, worker-merger, worker-ai 蝑匧<EFBFBD><EFBFBD><EFBFBD>鈭怎掩<EFBFBD><EFBFBD>銋剹<EFBFBD>?
* **包管理:** **pnpm** (推荐,节省磁盘空间,安装快)。
* **Monorepo (可选)** 建议使用 Turborepo Nx 管理 frontend, backend-api, worker-merger, worker-ai 等包,共享类型定义。
* **容器化:**
* **API Service:** <EFBFBD>删𠶖<EFBFBD><EFBFBD><EFBFBD><EFBFBD>舀偌撟單<EFBFBD>撅𨰻<EFBFBD>?
* **Worker Service:** <EFBFBD>閧𡠺<EFBFBD>函蔡嚗峕覔<EFBFBD>?CPU/<2F><><EFBFBD>韐蠘蝸餈𥡝<E9A488><F0A5A19D>拙捆嚗<E68D86><EFBFBD>急糓 Worker A 憭<><E686AD>憭扳<E686AD>隞嗆𧒄<E59786><F0A79284><EFBFBD><EFBFBD><E798A8>堒之嚗剹<E59A97>
* **API Service:** 无状态,可水平扩展。
* **Worker Service:** 单独部署,根据 CPU/内存负载进行扩容(特别是 Worker A 处理大文件时内存消耗大)。