Documents Services 重构规划
一、当前状态分析
1.1 目录结构概览
services/ (共50个文件)
├── 根目录散落文件: 30个
│ ├── evidence_service.py
│ ├── evidence_query_service.py
│ ├── evidence_admin_service.py
│ ├── evidence_export_service.py
│ ├── evidence_storage.py
│ ├── evidence_list_placeholder_service.py
│ ├── placeholder_service.py
│ ├── placeholder_admin_service.py
│ ├── placeholder_usage_service.py
│ ├── template_service.py
│ ├── template_matching_service.py
│ ├── document_template_query_service.py
│ ├── document_template_admin_service.py
│ ├── document_template_dto_assembler.py
│ ├── contract_template_query_service.py
│ ├── contract_template_binding_service.py
│ ├── folder_template_admin_service.py
│ ├── folder_service.py
│ ├── generation_service.py
│ ├── pdf_utils.py
│ ├── pdf_merge_service.py
│ ├── pdf_merge_utils.py
│ ├── wiring.py
│ └── ...
│
├── 子文件夹: 6个 (共74个文件)
│ ├── generation/ (18个)
│ ├── placeholders/ (28个)
│ ├── document_template/ (7个)
│ ├── folder_template/ (9个)
│ ├── evidence/ (5个)
│ └── external_template/ (4个)
1.2 问题诊断
| 问题类型 |
具体表现 |
影响 |
| 职责分散 |
evidence 相关功能散落在根目录和 evidence/ 文件夹 |
难以定位和维护 |
| 层级不一致 |
模板相关服务有 document_template/ 和 folder_template/,但 contract_template_query_service.py 在根目录 |
违反单一职责 |
| 命名冗余 |
evidence_service.py 和 evidence/evidence_mutation_service.py 并存 |
功能边界不清 |
| 辅助工具散落 |
pdf_utils.py, wiring.py 等基础设施在根目录 |
基础设施未归类 |
二、重构目标
- 统一组织逻辑: 按业务模块分包,不再散落
- 消除冗余: 合并功能重复的文件
- 保持兼容: 通过
__init__.py 导出确保现有导入不变
- 提升可维护性: 让目录结构直观反映业务领域
三、具体重构方案
3.1 目标目录结构
services/
├── evidence/ # 证据模块(整合)
│ ├── __init__.py # 合并导出
│ ├── evidence_service.py # 从根目录移入
│ ├── evidence_query_service.py
│ ├── evidence_admin_service.py
│ ├── evidence_export_service.py
│ ├── evidence_storage.py
│ ├── evidence_list_placeholder_service.py
│ └── evidence/ # 保留原子文件夹
│ ├── __init__.py
│ ├── evidence_file_service.py
│ ├── evidence_mutation_service.py
│ ├── evidence_query_service.py
│ ├── evidence_merge_usecase.py
│ └── page_range_calculator.py
│
├── placeholders/ # 占位符模块(已有结构)
│ ├── __init__.py # 新增根目录导出
│ ├── placeholder_service.py # 从根目录移入
│ ├── placeholder_admin_service.py
│ ├── placeholder_usage_service.py
│ ├── base.py
│ ├── registry.py
│ ├── types.py
│ ├── context_builder.py
│ └── authorization_materials/ ...
│ └── basic/ ...
│ └── case/ ...
│ └── contract/ ...
│ └── lawyer/ ...
│ └── litigation/ ...
│ └── party/ ...
│ └── supplementary/ ...
│
├── template/ # 模板模块(整合)
│ ├── __init__.py
│ ├── template_service.py # 从根目录移入
│ ├── template_matching_service.py
│ ├── template_audit_log_service.py
│ ├── document_template/ # 保留
│ │ ├── __init__.py
│ │ ├── repo.py
│ │ ├── query_service.py # 从根目录移入
│ │ ├── admin_service.py # 从根目录移入
│ │ ├── dto_assembler.py # 从根目录移入
│ │ └── ...
│ ├── folder_template/ # 保留
│ │ ├── __init__.py
│ │ ├── admin_service.py # 从根目录移入
│ │ └── ...
│ └── contract_template/
│ ├── __init__.py
│ ├── query_service.py # 从根目录移入
│ └── binding_service.py # 从根目录移入
│
├── generation/ # 文档生成模块(已有结构)
│ ├── __init__.py
│ ├── generation_service.py # 从根目录移入
│ └── ...
│
├── infrastructure/ # 基础设施模块(新建)
│ ├── __init__.py
│ ├── pdf_utils.py # 从根目录移入
│ ├── pdf_merge_utils.py # 从根目录移入
│ ├── pdf_merge_service.py # 从根目录移入
│ ├── wiring.py # 从根目录移入
│ └── path_utils.py # 建议从 generation/ 移入
│
└── code_placeholders/ # 代码占位符模块(整合)
├── __init__.py
├── registry.py # 从根目录移入
├── catalog_service.py # 从根目录移入
├── autodiscover.py # 从根目录移入
└── adapter.py # prompt_version_service_adapter.py 重命名
3.2 文件移动清单
移动到 evidence/
| 原路径 |
新路径 |
备注 |
evidence_service.py |
evidence/evidence_service.py |
|
evidence_query_service.py |
evidence/evidence_query_service.py |
与子文件夹内重名,需合并 |
evidence_admin_service.py |
evidence/evidence_admin_service.py |
|
evidence_export_service.py |
evidence/evidence_export_service.py |
|
evidence_storage.py |
evidence/evidence_storage.py |
|
evidence_list_placeholder_service.py |
evidence/evidence_list_placeholder_service.py |
|
移动到 placeholders/
| 原路径 |
新路径 |
备注 |
placeholder_service.py |
placeholders/placeholder_service.py |
|
placeholder_admin_service.py |
placeholders/placeholder_admin_service.py |
|
placeholder_usage_service.py |
placeholders/placeholder_usage_service.py |
|
移动到 template/
| 原路径 |
新路径 |
备注 |
template_service.py |
template/template_service.py |
|
template_matching_service.py |
template/template_matching_service.py |
|
template_audit_log_service.py |
template/template_audit_log_service.py |
|
document_template_query_service.py |
template/document_template/query_service.py |
|
document_template_admin_service.py |
template/document_template/admin_service.py |
|
document_template_dto_assembler.py |
template/document_template/dto_assembler.py |
|
folder_template_admin_service.py |
template/folder_template/admin_service.py |
|
contract_template_query_service.py |
template/contract_template/query_service.py |
|
contract_template_binding_service.py |
template/contract_template/binding_service.py |
|
移动到 infrastructure/
| 原路径 |
新路径 |
备注 |
pdf_utils.py |
infrastructure/pdf_utils.py |
|
pdf_merge_utils.py |
infrastructure/pdf_merge_utils.py |
|
pdf_merge_service.py |
infrastructure/pdf_merge_service.py |
|
wiring.py |
infrastructure/wiring.py |
|
移动到 code_placeholders/
| 原路径 |
新路径 |
备注 |
code_placeholder_registry.py |
code_placeholders/registry.py |
|
code_placeholder_catalog_service.py |
code_placeholders/catalog_service.py |
|
code_placeholder_autodiscover.py |
code_placeholders/autodiscover.py |
|
prompt_version_service_adapter.py |
code_placeholders/adapter.py |
|
移动到 generation/
| 原路径 |
新路径 |
备注 |
generation_service.py |
generation/generation_service.py |
|
移动到根目录(保留 `folder_service.py)
-` - 文件夹服务(业务逻辑较独立)
document_service_adapter.py - 外部适配器(需要保持在根目录供外部调用)
四、兼容性保障
4.1 使用 init.py 维持向后兼容
在每个模块的 __init__.py 中重新导出原有路径的类/函数,确保以下导入方式仍然有效:
from apps.documents.services import EvidenceService
from apps.documents.services import PlaceholderService
from apps.documents.services.evidence import EvidenceService
from apps.documents.services.placeholders import PlaceholderService
4.2 兼容性导出示例
from .evidence_service import EvidenceService
from .evidence_query_service import EvidenceQueryService
from .evidence_admin_service import EvidenceAdminService
__all__ = [
"EvidenceService",
"EvidenceQueryService",
"EvidenceAdminService",
]
五、实施步骤
阶段一:创建新目录结构(无风险)
- 创建
template/ 目录
- 创建
template/document_template/, template/folder_template/, template/contract_template/ 子目录
- 创建
infrastructure/ 目录
- 创建
code_placeholders/ 目录
阶段二:移动文件并更新导入(低风险)
按模块顺序执行:
- 移动 infrastructure/ - 基础设施,依赖最少
- 移动 code_placeholders/ - 基础设施之上,依赖较少
- 移动 template/ - 模板相关
- 移动 evidence/ - 证据相关
- 移动 placeholders/ - 占位符相关
- 移动 generation/ - 生成相关
每个模块完成后:
- 更新该模块内的相对导入
- 更新
__init__.py 导出
- 运行测试确保功能正常
阶段三:清理与验证(收尾)
- 删除不再需要的旧文件
- 更新外部调用方的导入路径(可选,保持兼容则跳过)
- 运行完整测试套件
- 更新相关文档
六、风险评估与缓解
| 风险 |
级别 |
缓解措施 |
| 外部调用方导入路径失效 |
高 |
使用 __init__.py 保持向后兼容 |
| 循环依赖 |
中 |
移动前分析依赖图,按正确顺序执行 |
| 测试失败 |
中 |
每阶段完成后运行测试,及时发现问题 |
| 合并冲突 |
低 |
使用 IDE 重构功能,避免手动移动 |
七、预计工作量
| 阶段 |
工作内容 |
预估文件数 |
| 阶段一 |
创建目录 |
4个目录 |
| 阶段二 |
移动并修复导入 |
约25个文件 |
| 阶段三 |
清理与验证 |
- |
八、建议执行顺序
- 先创建新目录结构(创建空目录和
__init__.py)
- 按依赖顺序移动文件:基础设施 → 代码占位符 → 模板 → 证据 → 占位符 → 生成
- 每移动一个模块,同时更新该模块的
__init__.py
- 保持根目录的
__init__.py 导出所有公共接口
- 最后进行清理和验证
附录:依赖关系图(简略)
infrastructure/ ← 无依赖
↑
code_placeholders/ ← 依赖 infrastructure
↑
placeholders/ ← 依赖 code_placeholders
↑
generation/ ← 依赖 placeholders, infrastructure
↑
template/ ← 依赖 placeholders
↑
evidence/ ← 依赖 placeholders