
# 产品需求文档：通用文档转换与管理服务 (UDC-M)
**Universal Document Converter & Manager - Backend Service**

| 文档版本     | V2.0                            |
| :------- | :------------------------------ |
| **最后更新** | 2025-12-09                      |
| **状态**   | 待开发                             |
| **涉及端**  | 后端 API, 异步 Worker, 对象存储, 关系型数据库 |
|          |                                 |

---

## 1. 项目背景与目标
### 1.1 背景
在构建智能题库、知识库或 RAG 应用时，文档不仅是需要被“消费”的临时素材，更是核心的**数字资产**。当前的痛点在于：
1.  缺乏统一的文档仓库，原始文件容易丢失。
2.  不同格式（PDF, Word, Excel）解析标准不一。
3.  解析过程中的图片/公式资源难以复用。

### 1.2 目标
构建一个**具备资产管理能力**的高性能文档服务。
*   **资产沉淀**：所有上传的原始文档（PDF, DOCX, XLSX, 图片等）均永久存储，并支持去重和历史记录查询。
*   **格式归一**：将异构文档转换为标准 Markdown（供 AI 使用）或 PDF/DOCX（供人阅读）。
*   **资源云化**：自动提取文档内的图片/公式，转为 MinIO 永久链接。
*   **样式定制**：支持 Word 模板渲染。

---

## 2. 系统架构设计

系统采用 **API 服务 + 关系型数据库 + 异步任务队列** 的架构。

### 2.1 核心组件
1.  **API Gateway (FastAPI)**:
    *   提供文档上传、查询、转换接口。
    *   负责文件 Hash 计算与秒传校验。
2.  **Metadata DB (PostgreSQL)**:
    *   存储文档元数据（文件名、大小、Hash、上传人）。
    *   存储转换任务记录（Task History）。
3.  **Task Broker (Redis)**: 维护任务队列 (`gpu-queue`, `cpu-queue`)。
4.  **Worker Cluster (Celery)**:
    *   **GPU Worker**: MinerU (PDF/Image -> Markdown)。
    *   **CPU Worker**: Pandoc/Pandas/WPS-RPC (Office -> Markdown, Markdown -> Docx)。
5.  **Storage (MinIO)**:
    *   `udc-raw`: **[永久]** 存放用户上传的原始文件（按 `hash/filename` 存储）。
    *   `udc-assets`: **[永久]** 存放解析出的图片资源。
    *   `udc-results`: **[永久]** 存放转换结果（MD/PDF）。
    *   `udc-templates`: **[永久]** 样式模板。

---

## 3. 功能需求详细说明

### 3.1 文档管理 (DMS Core)
*   **上传与去重**：用户上传文件时，计算 SHA256。若库中已存在该 Hash，则直接返回现有的 `document_id`（秒传），不重复上传 MinIO。
*   **版本/历史**：同一个 `document_id` 可以对应多个 `task_id`（例如：第一次解析失败，修正 bug 后重新解析；或者分别转换为 Markdown 和 PDF）。
*   **元数据检索**：支持按文件名、上传时间、文件类型查询文档。

### 3.2 转换路由策略 (Conversion Strategy)

| 输入格式 | 目标格式 | 引擎 | 逻辑说明 |
| :--- | :--- | :--- | :--- |
| **PDF / Image** | Markdown | **MinerU** (GPU) | 强依赖 GPU，提取截图并替换链接。 |
| **DOCX** | Markdown | **Pandoc** | 提取内嵌图片，保留 LaTeX 公式。 |
| **DOC** | Markdown | **WPS-RPC** -> PDF -> **MinerU** | 解决老旧 MathType 公式渲染问题。 |
| **XLSX** | Markdown | **Pandas** | 纯文本拼接，忽略内嵌图。 |
| **Markdown** | DOCX | **Pandoc** | 支持 `--reference-doc` 模板定制。 |

### 3.3 资产与链接处理
*   **图片处理**：所有转换产生的图片，均重命名为 MD5 Hash，存入 `udc-assets`。
*   **Markdown 清洗**：输出的 Markdown 中，所有图片链接必须是 MinIO 的完整 URL（如 `https://oss.example.com/udc-assets/a1b2...jpg`），禁止出现相对路径。

---

## 4. 数据库设计 (PostgreSQL Schema)

使用 SQLModel 定义，支撑 DMS 能力。

### 4.1 Table: `documents` (文档主表)
| 字段 | 类型 | 说明 |
| :--- | :--- | :--- |
| `id` | UUID (PK) | 文档唯一标识 |
| `file_hash` | VARCHAR(64) | SHA256，唯一索引 (Unique) |
| `filename` | VARCHAR | 原始文件名 |
| `file_type` | VARCHAR | 扩展名 (pdf, docx) |
| `file_size` | BIGINT | 字节数 |
| `storage_path` | VARCHAR | MinIO 路径 (`udc-raw/hash/filename`) |
| `created_at` | TIMESTAMP | 上传时间 |

### 4.2 Table: `conversion_tasks` (转换历史表)
| 字段 | 类型 | 说明 |
| :--- | :--- | :--- |
| `id` | UUID (PK) | 任务 ID |
| `document_id` | UUID (FK) | 关联文档 |
| `target_format` | VARCHAR | markdown, pdf, docx |
| `status` | VARCHAR | queued, processing, success, failed |
| `result_url` | VARCHAR | 结果文件下载链接 |
| `error_msg` | TEXT | 失败原因 |
| `created_at` | TIMESTAMP | 任务创建时间 |
| `completed_at` | TIMESTAMP | 完成时间 |

---

## 5. API 接口定义 (RESTful)

**Base URL**: `/api/v1`

### 5.1 文档管理
*   **POST** `/documents`
    *   **功能**：上传新文档（支持秒传）。
    *   **Body**: `file` (binary)
    *   **Response**: `{"document_id": "...", "is_exist": true/false}`
*   **GET** `/documents`
    *   **功能**：分页查询文档列表。
    *   **Query**: `page`, `size`, `keyword`

### 5.2 转换服务
*   **POST** `/conversions`
    *   **功能**：发起转换任务。
    *   **Body**:
        *   `document_id` (必填): 指向已上传的文档 ID。
        *   `target_format` (必填): `markdown`, `docx` 等。
        *   `template_id` (选填): 样式模板 ID。
        *   `force_ocr` (选填): Boolean。
    *   **Response**: `{"task_id": "..."}`

### 5.3 任务与结果
*   **GET** `/conversions/{task_id}`
    *   **功能**：查询状态及结果。
    *   **Response**:
        ```json
        {
          "status": "success",
          "result": {
             "content": "# Markdown内容...",
             "file_url": "https://minio.../res.md"
          }
        }
        ```

### 5.4 辅助接口
*   **POST** `/templates`: 上传 Word 样式模板。
*   **GET** `/files/{path}`: 文件代理下载（用于预览）。

---

## 6. 存储策略 (MinIO)

*   **udc-raw**: **永久存储**。目录结构建议：`/{year}/{month}/{hash}.ext`。
*   **udc-assets**: **永久存储**。用于存放 OCR 截图，目录结构：`/{hash_prefix}/{hash}.jpg`。
*   **udc-results**: **永久存储**。建议保留转换历史。
*   **udc-temp**: **1天过期**。用于打包下载的临时 ZIP 文件。

---

## 7. 非功能需求 (NFR)

1.  **大文件支持**: API 需支持 Stream 上传，避免内存溢出；Nginx 需放开 `client_max_body_size`。
2.  **GPU 调度**: 通过 Celery 限制 GPU Worker 的并发数（建议 1:1 或 1:2），防止显存 OOM。
3.  **超时控制**:
    *   PDF/OCR 任务：超时设定为 10 分钟。
    *   Office 转换任务：超时设定为 1 分钟。
4.  **可观测性**: 关键节点（开始转换、MinerU调用、上传MinIO）需打 Log，并在 Redis 记录进度百分比。

---

## 8. 技术选型与开发规范 (Technology Stack)

本系统采用 **"AI-Native"** 的开发策略，技术选型优先考虑与大模型（LLM）的兼容性、社区文档丰富度以及类型系统的完备性，以实现极致的 **Vibe Coding** 开发体验。

### 8.1 核心技术栈 (Core Stack)

| 组件 | 选型 | 版本要求 | 选型理由 |
| :--- | :--- | :--- | :--- |
| **开发语言** | **Python** | **3.10+** | 必须启用强类型提示 (Type Hints)；MinerU/Pandas 等核心库的原生语言；LLM 生成代码质量最高。 |
| **Web 框架** | **FastAPI** | Latest | 自动生成 OpenAPI 文档；基于 Pydantic 的类型验证是 AI 理解业务逻辑的最佳桥梁。 |
| **数据验证** | **Pydantic** | **V2** | 通过定义 Class Schema 驱动开发，AI 可根据 Schema 自动补全业务代码。 |
| **异步队列** | **Celery** | Latest | 处理 PDF OCR 等长耗时任务的工业级标准；配合 Redis 使用。 |
| **包管理** | **uv** | Latest | 极速 Python 包管理器（比 pip 快 10-100 倍），保障开发心流不被打断。 |
| **数据库** | **PostgreSQL** | 14+ | 优异的 JSONB 支持；配合 SQLModel 使用体验最佳。 |
| **ORM 框架** | **SQLModel** | Latest | 结合 SQLAlchemy 和 Pydantic，让数据库操作与数据验证统一，降低 AI 上下文切换成本。 |
| **对象存储** | **MinIO** | Latest | S3 兼容协议；用于存储海量非结构化数据。 |

### 8.2 Vibe Coding 开发工作流

为确保 AI 辅助编码的准确性和可维护性，开发过程需严格遵循以下工作流：

1.  **Schema First (模型驱动)**：
    *   在编写业务逻辑前，**必须先定义 Pydantic/SQLModel**。
    *   *理由*：Schema 是 AI 理解数据的“骨架”，骨架定义好，AI 填充“血肉”（逻辑）的准确率极高。

2.  **微提交策略 (Micro-Commits)**：
    *   **原则**：将 Git Commit 视为“游戏存档点”。
    *   **操作**：每当 AI 完成一个独立功能（如“完成MinIO上传函数”），**立即 Commit**。

3.  **模块化上下文 (Modular Context)**：
    *   **强制分包**：`routers/`, `services/`, `models/`, `tasks/`。
    *   *理由*：模块化让开发者可以只将相关文件喂给 AI，避免 Token 超限和幻觉。

4.  **环境隔离**：
    *   使用 `uv venv` 创建虚拟环境，依赖变更后运行 `uv sync`。

### 8.3 关键依赖库

*   **PDF/OCR**: `magic-pdf` (MinerU SDK) - **需 GPU 环境**。
*   **Word**: `pypandoc` (Pandoc 包装), `python-docx`。
*   **Excel**: `pandas`, `openpyxl`。
*   **WPS调用**: `pywpsrpc` (如果部署在 Linux) 或 `pywin32` (如果部署在 Windows 节点)。

---

## 9. 开发阶段规划

### Phase 1: 核心资产管理 (DMS)
*   搭建 FastAPI + PostgreSQL + MinIO。
*   实现文件上传、SHA256 去重、元数据存储。
*   实现基础的 API：`POST /documents`, `GET /documents`。

### Phase 2: CPU 转换能力
*   集成 Redis + Celery。
*   实现 `Pandoc` (Docx->MD) 和 `Pandas` (Excel->MD) Worker。
*   实现 Markdown 图片提取与 MinIO 上传逻辑。

### Phase 3: GPU 转换能力与优化
*   部署 MinerU 环境，实现 PDF -> Markdown。
*   实现 WPS/Windows 节点集成（解决老旧 Doc 公式）。
*   完善样式模板功能。