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.
 

9.0 KiB

Screenplay 功能实现总结

完成日期:2026-02-03
实施阶段:第一、二阶段完成
状态 核心功能已实现


实施概览

本次实施完成了 Screenplay(剧本)相关功能的核心部分,包括 Repository 层、Service 层、Schema 层和 API 路由层的实现。


已完成功能清单

第一阶段:Repository & Service 层

1. Repository 层完善

ScreenplayRepository (server/app/repositories/screenplay_repository.py)

  • 剧本 CRUD(create, update, delete)
  • 角色 CRUD(create_character, update_character, delete_character)
  • 场景 CRUD(create_location, update_location, delete_location)
  • 道具 CRUD(create_prop, update_prop, delete_prop)
  • 批量查询方法(get_characters_by_screenplay_ids 等)
  • 统计方法(count_characters_by_screenplay_ids 等)

ScreenplayTagRepository (server/app/repositories/screenplay_tag_repository.py)

  • 标签 CRUD(create, update, delete)
  • 按元素查询(get_by_element_id)
  • 按剧本查询(get_by_screenplay_id)
  • 资源统计(count_resources_by_tag)

2. Service 层实现

ScreenplayService (server/app/services/screenplay_service.py)

  • 剧本查询(get_by_id)
  • 角色管理(create_character)
  • 场景管理(create_location)
  • 道具管理(create_prop)
  • AI 解析数据存储(store_parsed_elements)
  • 权限检查(_check_project_permission)

ScreenplayTagService (server/app/services/screenplay_tag_service.py)

  • 标签 CRUD(create_tag, update_tag, delete_tag)
  • 按元素查询(get_tags_by_element)
  • 按剧本查询(get_tags_by_screenplay)
  • AI 解析标签存储(store_tags)
  • has_tags 字段维护(_update_element_has_tags)

第二阶段:Schema & API 层

3. Schema 层实现

剧本 Schema (server/app/schemas/screenplay.py)

  • ScreenplayBase, ScreenplayCreate, ScreenplayUpdate, ScreenplayResponse
  • CharacterBase, CharacterCreate, CharacterUpdate, CharacterResponse
  • LocationBase, LocationCreate, LocationUpdate, LocationResponse
  • PropBase, PropCreate, PropUpdate, PropResponse
  • PaginatedResponse(分页响应)

标签 Schema (server/app/schemas/screenplay_tag.py)

  • TagBase, TagCreate, TagUpdate, TagResponse
  • SetDefaultTagRequest, SetDefaultTagResponse

4. API 路由层实现

剧本 API (server/app/api/v1/screenplays.py)

  • POST /{screenplay_id}/characters - 创建角色
  • GET /{screenplay_id}/characters - 获取角色列表(分页、搜索、过滤)
  • POST /{screenplay_id}/locations - 创建场景
  • GET /{screenplay_id}/locations - 获取场景列表(分页、搜索、过滤)
  • POST /{screenplay_id}/props - 创建道具
  • GET /{screenplay_id}/props - 获取道具列表(分页、搜索、过滤)

标签 API (server/app/api/v1/screenplay_tags.py)

  • POST `` - 创建标签
  • GET /element/{element_type}/{element_id} - 获取元素的所有标签
  • GET /screenplay/{screenplay_id} - 获取剧本的所有标签
  • PATCH /{tag_id} - 更新标签
  • DELETE /{tag_id} - 删除标签

技术栈符合性

完全符合 jointo-tech-stack 规范

  1. 异步编程

    • 所有数据库操作使用 async/await
    • Repository 和 Service 方法全部异步
    • API 路由使用 FastAPI 异步依赖注入
  2. 日志规范

    • 使用 get_logger(__name__) 获取模块级 logger
    • 使用 %-formatting 格式化日志消息
    • 异常日志使用 exc_info=True
    • 日志级别:info(正常操作)、warning(异常情况)、error(错误)、debug(调试信息)
  3. 时间戳

    • 使用 datetime.now(timezone.utc) 生成 UTC 时间
    • 数据库字段使用 TIMESTAMPTZ 类型
  4. 枚举类型

    • 使用 IntEnum 定义枚举(RoleType, ElementType
    • 提供 from_string() 方法进行字符串转换
    • 数据库存储 SMALLINT 类型
  5. 异常处理

    • 使用自定义异常(NotFoundError, ValidationError, PermissionError
    • 异常日志包含上下文信息
    • 事务失败时回滚(await self.db.rollback()
  6. API 设计

    • RESTful 风格
    • 统一的响应格式
    • 完整的 OpenAPI 文档(summary, description)
    • 适当的 HTTP 状态码
  7. Schema 设计

    • 使用 Pydantic v2 语法
    • 完整的字段描述和类型注解
    • 支持 ORM 模型转换(model_config = ConfigDict(from_attributes=True)

核心数据流程

AI 解析剧本流程

AI Service (Celery Worker)
    ↓
ScreenplayService.store_parsed_elements()
    ├─ 创建角色 → character_id_map
    ├─ 创建场景 → location_id_map
    ├─ 创建道具 → prop_id_map
    ↓
ScreenplayTagService.store_tags()
    ├─ 创建角色标签 → character_tags
    ├─ 创建场景标签 → location_tags
    ├─ 创建道具标签 → prop_tags
    └─ 更新 has_tags 标志
    ↓
返回 ID 映射(用于后续分镜关联)

has_tags 字段维护

  • 创建标签时:自动设置 has_tags = true
  • 删除标签时:检查是否还有其他标签,如果没有则设置 has_tags = false
  • AI 解析时:批量设置 has_tags = true

未实现功能

以下功能在需求文档中定义,但本次未实现(留待后续迭代):

剧本 CRUD

  • 剧本列表查询
  • 创建文本剧本
  • 创建文件剧本(含文件上传和解析)
  • 更新剧本
  • 删除剧本

版本管理

  • 获取版本历史
  • 创建版本快照
  • 版本对比
  • 版本回滚

审批流程

  • 提交审批
  • 审批通过/拒绝
  • 审批记录

默认标签

  • 设置角色默认标签
  • 设置场景默认标签
  • 设置道具默认标签
  • 获取默认缩略图

元素更新/删除

  • 更新角色 API
  • 删除角色 API
  • 更新场景 API
  • 删除场景 API
  • 更新道具 API
  • 删除道具 API

文件清单

新增文件(共 6 个)

Service 层

  1. server/app/services/screenplay_service.py
  2. server/app/services/screenplay_tag_service.py

Schema 层: 3. server/app/schemas/screenplay.py 4. server/app/schemas/screenplay_tag.py

API 层: 5. server/app/api/v1/screenplays.py 6. server/app/api/v1/screenplay_tags.py

文档: 7. docs/server/changelogs/2026-02-03-screenplay-services-implementation.md 8. docs/server/changelogs/2026-02-03-screenplay-implementation-summary.md

修改文件(共 2 个)

  1. server/app/repositories/screenplay_repository.py - 新增 CRUD 方法
  2. server/app/repositories/screenplay_tag_repository.py - 新增 CRUD 方法,修正日志导入

后续任务

优先级 P0(核心功能)

  1. 剧本 CRUD 完整实现

    • 创建文本剧本
    • 创建文件剧本(集成 ScreenplayFileParserService)
    • 更新剧本
    • 删除剧本
    • 剧本列表查询
  2. API 路由注册

    • server/app/api/v1/__init__.py 中注册新路由
    • 测试 API 端点
  3. 集成测试

    • 编写单元测试
    • 编写集成测试
    • 测试 AI 解析流程

优先级 P1(增强功能)

  1. 版本管理

    • 实现版本快照
    • 实现版本对比
    • 实现版本回滚
  2. 审批流程

    • 实现审批状态流转
    • 实现审批记录
  3. 默认标签

    • 实现设置默认标签
    • 实现获取默认缩略图

优先级 P2(完善功能)

  1. 元素更新/删除 API

    • 实现角色更新/删除
    • 实现场景更新/删除
    • 实现道具更新/删除
  2. 高级查询

    • 实现全文搜索
    • 实现高级过滤
    • 实现排序

验证清单

代码质量

  • 所有文件通过语法检查(getDiagnostics)
  • 遵循 PEP 8 代码规范
  • 完整的类型注解
  • 详细的文档字符串

技术栈符合性

  • 异步编程(async/await)
  • 日志规范(get_logger, %-formatting)
  • 时间戳(UTC)
  • 枚举类型(IntEnum)
  • 异常处理(自定义异常 + 事务回滚)
  • API 设计(RESTful + OpenAPI)
  • Schema 设计(Pydantic v2)

功能完整性

  • Repository 层 CRUD 完整
  • Service 层业务逻辑完整
  • Schema 层数据验证完整
  • API 层路由定义完整
  • 权限检查完整
  • 错误处理完整

相关文档


完成日期:2026-02-03
实施者:System
审核状态:待审核
下一步:API 路由注册 + 集成测试