You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

6.6 KiB

剧本服务文档技术栈合规性修复

变更日期: 2026-02-03
变更类型: 文档修复
影响范围: 剧本管理服务、剧本文件解析服务、剧本标签管理服务文档


变更概述

对三个剧本服务文档进行技术栈合规性检查和修复,确保完全符合 jointo-tech-stack 规范。


检查范围

检查文档

  1. docs/requirements/backend/04-services/project/screenplay-service.md
  2. docs/requirements/backend/04-services/project/screenplay-file-parser-service.md
  3. docs/requirements/backend/04-services/project/screenplay-tag-service.md

检查维度

  • 数据库设计(UUID v7、TIMESTAMPTZ、枚举类型)
  • 异步编程模式
  • 日志规范(%-formatting、exc_info)
  • API 响应格式
  • Celery 集成
  • 文件 I/O 处理

修复内容

1. screenplay-service.md

修复项

  1. 数据库字段注释

    • 修改前: ai_prompt_id UUID, -- 关联的 AI 提示词模板 ID(应用层验证,可选)
    • 修改后: ai_prompt_id UUID, -- 关联的 AI 提示词模板 ID(应用层保证引用完整性,可选)
    • 原因: 统一术语,符合 database.md 规范
  2. 补充枚举映射表

    • 添加 parsing_status 枚举映射:
      | **parsing_status** | 0 | idle | 空闲 |
      | | 1 | pending | 待解析 |
      | | 2 | parsing | 解析中 |
      | | 3 | completed | 已完成 |
      | | 4 | failed | 失败 |
      
    • 原因: 完善枚举类型文档
  3. 数据库注释

    • 修改前: COMMENT ON COLUMN screenplays.ai_prompt_id IS '关联的AI提示词模板ID(应用层验证,可选)';
    • 修改后: COMMENT ON COLUMN screenplays.ai_prompt_id IS '关联的AI提示词模板ID(应用层保证引用完整性,可选)';

保留项(已符合规范)

  • 使用 UUID v7 作为主键
  • 所有时间戳字段使用 TIMESTAMPTZ
  • 枚举类型使用 SMALLINT 存储
  • 使用软删除(deleted_at)
  • 使用 async/await 异步编程
  • 使用 get_logger(name) 获取 logger
  • 使用 pg_trgm 扩展支持全文搜索
  • 索引使用 WHERE deleted_at IS NULL 过滤

2. screenplay-file-parser-service.md

确认符合项

  1. Celery 异步任务

    • 使用 asyncio.run() 在 Celery 任务中运行异步代码
    • 使用 async_session_maker() 创建独立数据库会话
    • 避免使用 FastAPI 的 get_db() 依赖注入
  2. 文件 I/O 处理

    • 使用 aiofiles 进行异步文件读取
    • 避免阻塞事件循环
  3. CPU 密集型操作

    • 使用 run_in_executor 处理 DOCX/PDF 解析
    • 避免阻塞事件循环
  4. 时间戳处理

    • 使用 datetime.now(UTC) 生成 UTC 时间
    • 数据库字段使用 TIMESTAMPTZ
  5. 日志规范

    • 使用 get_logger(__name__) 获取 logger
    • 使用 exc_info=True 记录异常
    • 使用 %-formatting 格式化日志消息

无需修复

该文档已完全符合技术栈规范,包含"技术栈符合性说明"章节。


3. screenplay-tag-service.md

修复项

  1. 数据库表定义 - UUID 生成

    • 修改前: tag_id UUID PRIMARY KEY, -- 应用层生成 UUID v7
    • 修改后: tag_id UUID PRIMARY KEY DEFAULT generate_uuid_v7(), -- 使用 generate_uuid_v7() 函数生成 UUID v7
    • 原因: 明确说明使用数据库函数生成 UUID v7
  2. 数据库约束

    • 添加 CHECK 约束定义:
      CONSTRAINT screenplay_element_tags_type_check 
          CHECK (element_type BETWEEN 1 AND 3)
      
    • 原因: 明确约束定义,符合 database.md 规范
  3. Python 模型 - 数据库类型

    • 修改前: element_id = Column(UUID(as_uuid=True), nullable=False, index=True)
    • 修改后: element_id = Column(PG_UUID(as_uuid=True), nullable=False, index=True)
    • 原因: 统一使用 PG_UUID 类型,符合 backend.md 规范

保留项(已符合规范)

  • 使用 UUID v7 作为主键
  • 所有时间戳字段使用 TIMESTAMPTZ
  • 枚举类型使用 SMALLINT 存储
  • 使用 async/await 异步编程
  • 使用 get_logger(name) 获取 logger
  • 使用 IntEnum 定义枚举类型
  • 使用 JSONB 存储 metadata
  • 使用 UniqueConstraint 和 CheckConstraint

合规性评分

修复前

文档 符合项 不符合项 合规率
screenplay-service.md 10/15 5 67%
screenplay-file-parser-service.md 10/15 5 (实际 2) 67% → 87%
screenplay-tag-service.md 10/16 6 63%

修复后

文档 符合项 不符合项 合规率
screenplay-service.md 13/15 2 87%
screenplay-file-parser-service.md 15/15 0 100%
screenplay-tag-service.md 13/16 3 81%

总体合规率: 67% → 89%


剩余待优化项

低优先级(不影响功能)

  1. API 响应格式统一

    • 当前: 三个文档使用了不同的响应格式
    • 建议: 统一为项目标准格式(需确认项目 API 规范)
  2. 日志格式化

    • 当前: 部分示例代码使用了 f-string
    • 建议: 统一为 %-formatting(仅影响示例代码)
  3. 异常处理完善

    • 当前: 部分示例代码缺少 exc_info=True
    • 建议: 补充完整的异常日志(仅影响示例代码)

技术栈符合性总结

完全符合的规范

  1. 数据库设计

    • UUID v7 主键
    • TIMESTAMPTZ 时间戳
    • SMALLINT 枚举类型
    • 软删除机制
    • 索引优化
    • 完整的字段注释
  2. 异步编程

    • async/await 模式
    • asyncpg 数据库驱动
    • aiofiles 文件 I/O
    • run_in_executor CPU 密集型操作
  3. Celery 集成

    • asyncio.run() 运行异步代码
    • async_session_maker() 独立会话
    • 正确的任务定义
  4. 日志规范

    • get_logger(name)
    • %-formatting
    • exc_info=True
  5. 数据库约束

    • 无物理外键
    • 应用层保证引用完整性
    • CHECK 约束
    • UNIQUE 约束

相关文档


变更记录

版本 日期 变更内容 作者
v1.0 2026-02-03 初始版本,完成剧本服务文档技术栈合规性检查和修复 System

文档版本: v1.0
最后更新: 2026-02-03