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.
 

28 KiB

剧本解析接口实现问题分析报告

文档版本:v1.0
创建日期:2026-02-07
分析人员:AI Assistant
状态:待审核确认


目录

  1. 分析范围
  2. 参考文档对比
  3. 关键问题汇总
  4. 详细问题分析
  5. 已正确实现的部分
  6. 修复方案建议
  7. 影响评估
  8. 附录:代码路径索引

分析范围

检查对象

  • 实现代码

    • server/app/tasks/ai_tasks.py (parse_screenplay_task)
    • server/app/services/screenplay_service.py (store_parsed_elements)
    • server/app/api/v1/screenplays.py (解析接口)
  • 参考文档

    • docs/prompts/screenplay-ai-parse-prompt.md (AI 提示词规范)
    • docs/requirements/backend/workflows/screenplay-ai-parse-workflow.md (工作流文档)

检查维度

  1. 是否符合工作流文档的完整步骤
  2. 是否按照 AI Prompt 文档生成数据
  3. 分镜数据入口是否正确处理
  4. 资源入口(project_resources)是否关联

参考文档对比

工作流文档要求(screenplay-ai-parse-workflow.md)

根据文档 L55-L148 定义的完整流程图,AI 解析剧本工作流应包含以下步骤:

步骤 1-4:用户上传剧本、触发解析、积分检查、任务创建
步骤 5:AI 返回结构化 JSON
步骤 6:自动存储角色数据 ✅
步骤 7:自动存储场景数据 ✅
步骤 8:自动存储道具数据 ✅
步骤 9:自动存储标签数据 ✅
步骤 10:自动创建分镜记录 ❌ **缺失**
步骤 11:自动关联分镜与元素 ❌ **缺失**
步骤 12-13:更新任务状态、返回结果

AI Prompt 文档要求(screenplay-ai-parse-prompt.md)

文档明确定义了两阶段解析策略(L21-L49):

  • 阶段1:提取元素(角色、场景、道具、标签)
  • 阶段2:拆解分镜(包含元素关联)

实际实现:当前 ai_tasks.py L898-949 使用的是单阶段解析,与文档不符。


关键问题汇总

问题编号 严重程度 问题描述 影响范围 状态
P0-01 🔴 严重 分镜数据未入库 核心功能缺失 待修复
P0-02 🔴 严重 分镜元素关联逻辑缺失 数据完整性 待修复
P1-01 🟡 重要 project_resources 表未关联 资源管理功能 待修复
P1-02 🟡 重要 AI Prompt 文档与实际实现不一致 文档准确性 待修复
P2-01 🟢 一般 标签冗余字段未存储 查询性能 待优化

详细问题分析

🔴 P0-01:分镜数据未入库

问题描述

当前实现

# server/app/services/screenplay_service.py L413-511
async def store_parsed_elements(
    self,
    screenplay_id: UUID,
    parsed_data: Dict[str, Any]
) -> Dict[str, Any]:
    # 1. 存储角色 ✅
    # 2. 存储场景 ✅
    # 3. 存储道具 ✅
    # 4. 存储标签 ✅
    # 5. 更新剧本统计 ✅
    
    # ❌ 缺失:没有处理 parsed_data['storyboards'] 数组
    # ❌ 缺失:没有调用任何分镜存储逻辑
    
    return {
        'character_id_map': ...,
        'location_id_map': ...,
        'prop_id_map': ...,
        'tag_id_maps': ...
        # ❌ 缺失:没有返回 storyboard_ids
    }

参考文档要求(L788-804):

# 阶段2:存储分镜
async def store_storyboards(
    screenplay_id: UUID,
    storyboards_data: List[Dict],
    tag_id_maps: Dict
):
    """存储阶段2的解析结果"""
    storyboard_ids = await storyboard_service.create_storyboards_from_ai(
        screenplay_id=screenplay_id,
        storyboards_data=storyboards_data,
        tag_id_maps=tag_id_maps
    )
    return storyboard_ids

影响分析

  1. 功能影响

    • AI 解析返回的分镜数据(通常 10-20 个)全部丢失
    • 用户无法查看 AI 生成的分镜列表
    • 工作流无法闭环,步骤 10-11 完全缺失
  2. 数据影响

    • storyboards 表中没有 AI 生成的记录
    • storyboard_id_map 未生成,无法追溯
    • 后续基于分镜的功能(如视频合成)无法使用
  3. 用户体验

    • 用户触发解析后,只能看到角色/场景/道具
    • 需要手动创建所有分镜,失去 AI 自动化的核心价值

复现路径

# 1. 用户上传剧本
POST /api/v1/screenplays
{
  "project_id": "xxx",
  "name": "测试剧本",
  "content": "..."
}

# 2. 触发 AI 解析
POST /api/v1/screenplays/{screenplay_id}/parse
{
  "auto_create_storyboards": true  # ⚠️ 虽然设为 true,但实际未生效
}

# 3. 查询分镜列表
GET /api/v1/projects/{project_id}/storyboards?screenplay_id={screenplay_id}
# ❌ 返回:{"total": 0, "items": []}  # 应该有 AI 生成的分镜

根因分析

  1. Celery Task 层ai_tasks.py L1088-1119):

    if auto_create_elements or auto_create_tags or auto_create_storyboards:
        # 调用 screenplay_service.store_parsed_elements()
        # ❌ 但该方法内部没有处理 storyboards
    
  2. Service 层screenplay_service.py):

    • 缺少 _create_storyboards_from_ai() 方法
    • store_parsed_elements() 未调用任何分镜存储逻辑
  3. 参数传递问题

    • store_parsed_elements() 签名中缺少 auto_create_storyboards 参数
    • 即使传入该参数,也没有对应的处理分支

🔴 P0-02:分镜元素关联逻辑缺失

问题描述

文档要求(L870-1076):

分镜数据结构应包含元素关联:

{
  "storyboards": [
    {
      "shot_number": "001",
      "title": "开场",
      "characters": ["张三", "李四"],
      "character_tags": {
        "张三": "adult",
        "李四": "youth"
      },
      "locations": ["咖啡厅"],
      "location_tags": {
        "咖啡厅": "modern"
      },
      "props": ["笔记本电脑"],
      "prop_tags": {}
    }
  ]
}

关联逻辑要求(L887-995):

  1. 遍历分镜数组
  2. 根据 characters 数组中的名称,从 character_id_map 查找 character_id
  3. 根据 character_tags 映射,构建 "张三-adult" 查找 element_tag_id
  4. character_id 写入 storyboards.screenplay_character_ids 数组
  5. element_tag_id 写入 storyboards.element_tag_ids 数组
  6. 对场景、道具执行相同逻辑

当前状态

  • 完全没有实现上述关联逻辑
  • 无法建立分镜与角色/场景/道具的关系
  • 无法建立分镜与标签的关系

影响分析

  1. 查询影响

    • 查询分镜时无法知道包含哪些角色
    • 无法通过角色/场景反向查询相关分镜
    • 无法获取分镜中角色的具体标签(少年版 vs 成年版)
  2. 业务影响

    • 视频合成时无法确定需要哪些素材
    • 资源管理系统无法自动关联
    • 分镜预览功能缺失关键信息
  3. 数据完整性

    • 数据库中存在孤立的分镜记录
    • 无法追溯分镜与剧本元素的关系
    • 违反了工作流文档定义的数据模型

数据库字段对比

字段名 类型 文档要求 当前实现
screenplay_character_ids UUID[] 关联角色 ID 数组 未填充
screenplay_scene_ids UUID[] 关联场景 ID 数组 未填充
screenplay_prop_ids UUID[] 关联道具 ID 数组 未填充
element_tag_ids UUID[] 关联标签 ID 数组 未填充

🟡 P1-01:project_resources 表未关联

问题描述

文档要求(L49):

- `project_resources`:项目素材表(关联标签,存储冗余字段 element_name、tag_label)

当前状态

  • 整个代码库中未发现与 project_resources 相关的逻辑
  • 分镜创建后未同步创建素材记录
  • 缺少"资源入口"处理

影响分析

  1. 功能影响

    • 无法通过分镜查询关联的素材资源
    • 素材管理系统与分镜系统脱节
    • 无法实现"分镜 → 素材 → 渲染"的完整链路
  2. 性能影响

    • 缺少冗余字段 element_name/tag_label
    • 查询分镜详情时需要多次 JOIN
    • 列表查询性能低下
  3. 数据一致性

    • 素材与分镜的关联无法自动维护
    • 需要额外的后台任务补全数据

预期实现

# 在存储分镜后,同步创建 project_resources 记录
async def _sync_storyboard_resources(
    self,
    storyboard_id: UUID,
    project_id: UUID,
    character_ids: List[UUID],
    character_tag_ids: List[UUID],
    # ...
):
    """同步创建项目素材记录"""
    for char_id, tag_id in zip(character_ids, character_tag_ids):
        # 查询角色名称和标签名称
        character = await self.repository.get_character(char_id)
        tag = await self.tag_repository.get_tag(tag_id)
        
        # 创建素材记录
        await self.resource_repository.create(ProjectResource(
            project_id=project_id,
            resource_type='character',
            element_id=char_id,
            element_tag_id=tag_id,
            element_name=character.name,  # 冗余字段
            tag_label=tag.tag_label,      # 冗余字段
            # ...
        ))

🟡 P1-02:AI Prompt 文档与实际实现不一致

问题描述

文档定义screenplay-ai-parse-prompt.md L21-L49):

采用两阶段解析策略:

阶段1:提取全局元素(1次AI调用)
- 输入:完整剧本文本
- 输出:角色、场景、道具及其标签

阶段2:分批拆解分镜(N次AI调用,可并行)
- 输入:剧本片段 + 已提取的元素列表
- 输出:该片段的分镜数组

实际实现ai_tasks.py L898-1087):

采用单阶段解析

# 构建解析提示词(参考 docs/prompts/screenplay-ai-parse-prompt.md)
system_prompt = """# 系统角色
你是一个专业的影视剧本分析专家,擅长从剧本中提取角色、场景、道具信息,
并识别它们的不同状态和变体。

# 任务说明
请分析以下剧本,提取所有角色、场景、道具信息,并为每个元素识别不同的状态标签。

# 输出格式要求
请严格按照以下JSON格式返回结果:
{
  "characters": [...],
  "character_tags": {...},
  "locations": [...],
  "props": [...],
  "storyboards": [...]  # ⚠️ 一次性返回所有数据
}
"""

不一致点对比

维度 文档定义 实际实现 影响
解析阶段 两阶段(分步骤) 单阶段(一次性) Token 超限风险高
并行能力 阶段2可并行 无并行逻辑 性能瓶颈
分镜结构 详细元素关联 简化版结构 数据不完整
用户交互 阶段1后可审核 无中间审核 用户体验差
Token 优化 分批次降低消耗 单次消耗大 成本高

根因分析

  1. 文档未同步更新

    • screenplay-ai-parse-prompt.md 可能是旧版设计
    • 实际开发时简化为单阶段实现
    • 未回溯更新文档
  2. 两阶段实现复杂度高

    • 需要前端支持中间状态展示
    • 需要后端支持状态机管理
    • 可能因工期压力选择简化方案
  3. Token 风险评估不足

    • 之前的 Token 风险分析(2026-02-07-token-risk-analysis.md)已指出问题
    • 但未落实两阶段解析方案

🟢 P2-01:标签冗余字段未存储

问题描述

文档要求(L49、L640-666):

在分镜的元素关联中,应包含冗余字段:

分镜角色关联字段:
- element_name (映射到 name 字段)
- tag_label (映射到 tag_label 字段)
- action_description (映射到 action 字段)
- spatial_position (映射到 position 字段)

当前状态

  • screenplay_element_tags 表已正确存储标签数据
  • 但分镜关联时未冗余存储 element_name/tag_label

影响分析

  1. 查询性能

    • 每次查询分镜详情都需要 JOIN screenplay_element_tags
    • 列表查询时性能问题严重(N+1 查询)
  2. 建议优化

    • storyboards 表或关联表中冗余存储常用字段
    • 使用 PostgreSQL 的 JSONB 字段存储快照数据

已正确实现的部分

正确实现列表

功能模块 实现位置 验证状态
角色数据存储 screenplay_service.py L422-436 通过测试
场景数据存储 screenplay_service.py L438-451 通过测试
道具数据存储 screenplay_service.py L453-465 通过测试
标签数据存储 screenplay_tag_service.store_tags() 通过测试
file_url 下载 storage_service.download_text_file() 通过测试(v1.2.0)
自定义参数 custom_requirements/storyboard_count 通过测试(v1.1.0)
权限检查 _check_project_permission() 正确实现
积分管理 Credit Service 预扣/确认机制 正确实现
异步任务 Celery parse_screenplay_task 正确实现

修复方案建议

方案概览

┌─────────────────────────────────────────────────────────────┐
│                    修复方案优先级                              │
├─────────────────────────────────────────────────────────────┤
│ Phase 1(必须):修复分镜存储逻辑        [P0-01, P0-02]      │
│ Phase 2(重要):补全项目素材关联        [P1-01]             │
│ Phase 3(优化):统一文档与实现          [P1-02, P2-01]      │
└─────────────────────────────────────────────────────────────┘

Phase 1:修复分镜存储逻辑(必须)

1.1 在 screenplay_service.py 中添加新方法

新增方法

async def _create_storyboards_from_ai(
    self,
    screenplay_id: UUID,
    project_id: UUID,
    storyboards_data: List[Dict[str, Any]],
    character_id_map: Dict[str, UUID],
    location_id_map: Dict[str, UUID],
    prop_id_map: Dict[str, UUID],
    tag_id_maps: Dict[str, Dict[str, UUID]]
) -> List[UUID]:
    """批量存储分镜并建立元素关联
    
    参考文档:screenplay-ai-parse-workflow.md L887-995
    
    Args:
        screenplay_id: 剧本 ID
        project_id: 项目 ID
        storyboards_data: AI 返回的分镜数据数组
        character_id_map: 角色名 → character_id 映射
        location_id_map: 场景名 → location_id 映射
        prop_id_map: 道具名 → prop_id 映射
        tag_id_maps: 标签 ID 映射(character_tags/location_tags/prop_tags)
    
    Returns:
        创建的分镜 ID 列表
    """
    from app.repositories.storyboard_repository import StoryboardRepository
    from app.models.storyboard import Storyboard, ShotSize, CameraMovement
    
    storyboard_repo = StoryboardRepository(self.db)
    storyboard_ids = []
    
    for sb_data in storyboards_data:
        # 1. 解析角色关联
        character_ids = []
        character_tag_ids = []
        for char_name in sb_data.get('characters', []):
            char_id = character_id_map.get(char_name)
            if char_id:
                character_ids.append(char_id)
                
                # 检查是否指定标签
                tag_key = sb_data.get('character_tags', {}).get(char_name)
                if tag_key:
                    map_key = f"{char_name}-{tag_key}"
                    tag_id = tag_id_maps.get('character_tags', {}).get(map_key)
                    if tag_id:
                        character_tag_ids.append(tag_id)
        
        # 2. 解析场景关联
        location_ids = []
        location_tag_ids = []
        for loc_name in sb_data.get('locations', []):
            loc_id = location_id_map.get(loc_name)
            if loc_id:
                location_ids.append(loc_id)
                
                tag_key = sb_data.get('location_tags', {}).get(loc_name)
                if tag_key:
                    map_key = f"{loc_name}-{tag_key}"
                    tag_id = tag_id_maps.get('location_tags', {}).get(map_key)
                    if tag_id:
                        location_tag_ids.append(tag_id)
        
        # 3. 解析道具关联
        prop_ids = []
        prop_tag_ids = []
        for prop_name in sb_data.get('props', []):
            prop_id = prop_id_map.get(prop_name)
            if prop_id:
                prop_ids.append(prop_id)
                
                tag_key = sb_data.get('prop_tags', {}).get(prop_name)
                if tag_key:
                    map_key = f"{prop_name}-{tag_key}"
                    tag_id = tag_id_maps.get('prop_tags', {}).get(map_key)
                    if tag_id:
                        prop_tag_ids.append(tag_id)
        
        # 4. 创建分镜记录
        storyboard = Storyboard(
            project_id=project_id,
            screenplay_id=screenplay_id,
            shot_number=sb_data.get('shot_number'),
            title=sb_data['title'],
            description=sb_data.get('description'),
            shooting_description=sb_data.get('shooting_description'),
            shot_size=ShotSize(sb_data['shot_size']) if sb_data.get('shot_size') else None,
            camera_movement=CameraMovement(sb_data['camera_movement']) if sb_data.get('camera_movement') else None,
            estimated_duration=sb_data.get('estimated_duration'),
            order_index=sb_data.get('order_index', 0),
            start_time=sb_data.get('start_time'),
            end_time=sb_data.get('end_time'),
            meta_data=sb_data.get('meta_data', {}),
            # 关联字段
            screenplay_character_ids=character_ids,
            screenplay_location_ids=location_ids,
            screenplay_prop_ids=prop_ids,
            element_tag_ids=character_tag_ids + location_tag_ids + prop_tag_ids
        )
        
        created = await storyboard_repo.create(storyboard)
        storyboard_ids.append(created.storyboard_id)
        
        logger.info(
            "创建分镜: storyboard_id=%s, shot_number=%s, 关联角色=%d, 场景=%d, 道具=%d, 标签=%d",
            created.storyboard_id,
            created.shot_number,
            len(character_ids),
            len(location_ids),
            len(prop_ids),
            len(character_tag_ids + location_tag_ids + prop_tag_ids)
        )
    
    return storyboard_ids

1.2 修改 store_parsed_elements() 方法

修改签名

async def store_parsed_elements(
    self,
    screenplay_id: UUID,
    parsed_data: Dict[str, Any],
    auto_create_elements: bool = True,  # 新增参数
    auto_create_tags: bool = True,      # 新增参数
    auto_create_storyboards: bool = True  # 新增参数
) -> Dict[str, Any]:

添加分镜存储逻辑

# 在 L477 标签存储之后添加

# 5. 存储分镜(如果启用)
storyboard_ids = []
if auto_create_storyboards and parsed_data.get('storyboards'):
    # 获取项目 ID
    screenplay = await self.repository.get_by_id(screenplay_id)
    if not screenplay:
        raise Exception(f"剧本不存在: {screenplay_id}")
    
    storyboard_ids = await self._create_storyboards_from_ai(
        screenplay_id=screenplay_id,
        project_id=screenplay.project_id,
        storyboards_data=parsed_data['storyboards'],
        character_id_map=character_id_map,
        location_id_map=location_id_map,
        prop_id_map=prop_id_map,
        tag_id_maps=tag_id_maps
    )
    
    logger.info(
        "分镜存储成功: screenplay_id=%s, 数量=%d",
        screenplay_id,
        len(storyboard_ids)
    )

# 6. 更新剧本统计(修改原有逻辑)
await self.repository.update(screenplay_id, {
    'character_count': len(character_id_map),
    'location_count': len(location_id_map),
    'parsing_status': 'completed'
})

修改返回值

return {
    'character_id_map': character_id_map,
    'location_id_map': location_id_map,
    'prop_id_map': prop_id_map,
    'tag_id_maps': tag_id_maps,
    'storyboard_ids': storyboard_ids,  # 新增
    'characters_created': len(character_id_map),
    'scenes_created': len(location_id_map),
    'props_created': len(prop_id_map),
    'tags_created': sum(len(tags) for tags in tag_id_maps.values()),
    'storyboards_created': len(storyboard_ids)  # 新增
}

1.3 更新 ai_tasks.py 调用

修改 L1098 调用

storage_result = await screenplay_service.store_parsed_elements(
    screenplay_id=UUID(screenplay_id),
    parsed_data=parsed_data,
    auto_create_elements=auto_create_elements,    # 传递参数
    auto_create_tags=auto_create_tags,            # 传递参数
    auto_create_storyboards=auto_create_storyboards  # 传递参数
)

Phase 2:补全项目素材关联(重要)

2.1 实现 _sync_storyboard_resources() 方法

位置screenplay_service.py

实现

async def _sync_storyboard_resources(
    self,
    storyboard_id: UUID,
    project_id: UUID,
    screenplay_id: UUID,
    character_ids: List[UUID],
    character_tag_ids: List[UUID],
    location_ids: List[UUID],
    location_tag_ids: List[UUID],
    prop_ids: List[UUID],
    prop_tag_ids: List[UUID]
) -> int:
    """同步创建项目素材记录
    
    为分镜关联的角色/场景/道具创建 project_resources 记录
    冗余存储 element_name/tag_label 用于快速查询
    """
    from app.repositories.project_resource_repository import ProjectResourceRepository
    from app.models.project_resource import ProjectResource, ResourceType
    
    resource_repo = ProjectResourceRepository(self.db)
    created_count = 0
    
    # 1. 处理角色素材
    for char_id, tag_id in zip(character_ids, character_tag_ids or []):
        # 查询角色信息
        character = await self.repository.get_character(char_id)
        if not character:
            continue
        
        # 查询标签信息
        tag_label = None
        if tag_id:
            from app.services.screenplay_tag_service import ScreenplayTagService
            tag_service = ScreenplayTagService(self.db)
            tag = await tag_service.get_tag(tag_id)
            if tag:
                tag_label = tag.tag_label
        
        # 创建素材记录
        resource = ProjectResource(
            project_id=project_id,
            resource_type=ResourceType.CHARACTER,
            element_id=char_id,
            element_tag_id=tag_id,
            element_name=character.name,  # 冗余字段
            tag_label=tag_label,          # 冗余字段
            screenplay_id=screenplay_id,
            storyboard_id=storyboard_id,
            meta_data={}
        )
        await resource_repo.create(resource)
        created_count += 1
    
    # 2. 处理场景素材(逻辑类似)
    # 3. 处理道具素材(逻辑类似)
    
    logger.info(
        "素材关联完成: storyboard_id=%s, 创建素材=%d",
        storyboard_id, created_count
    )
    
    return created_count

2.2 在分镜创建后调用

修改 _create_storyboards_from_ai() 方法

# 在 L4 创建分镜记录之后添加

# 5. 同步创建项目素材
await self._sync_storyboard_resources(
    storyboard_id=created.storyboard_id,
    project_id=project_id,
    screenplay_id=screenplay_id,
    character_ids=character_ids,
    character_tag_ids=character_tag_ids,
    location_ids=location_ids,
    location_tag_ids=location_tag_ids,
    prop_ids=prop_ids,
    prop_tag_ids=prop_tag_ids
)

Phase 3:统一文档与实现(优化)

3.1 更新 AI Prompt 文档

选项 A:保持单阶段实现,更新文档

  • 修改 screenplay-ai-parse-prompt.md
  • 删除两阶段解析章节
  • 统一为单阶段解析说明

选项 B:实现两阶段解析,符合文档

  • 实现阶段1:提取元素 API
  • 实现阶段2:拆解分镜 API
  • 前端支持中间状态展示
  • 后端支持状态机管理

建议:优先选择 A(工作量小,快速修复),后续迭代再考虑 B。

3.2 添加冗余字段存储

位置_create_storyboards_from_ai() 方法

修改

# 在创建 Storyboard 对象时,添加 meta_data 冗余信息
storyboard = Storyboard(
    # ...existing fields
    meta_data={
        **sb_data.get('meta_data', {}),
        # 冗余存储元素名称(用于快速查询)
        'character_names': [character_id_map_reverse[cid] for cid in character_ids],
        'location_names': [location_id_map_reverse[lid] for lid in location_ids],
        'prop_names': [prop_id_map_reverse[pid] for pid in prop_ids],
        # 冗余存储标签名称
        'character_tags': sb_data.get('character_tags', {}),
        'location_tags': sb_data.get('location_tags', {}),
        'prop_tags': sb_data.get('prop_tags', {})
    }
)

影响评估

修复后功能对比

功能点 修复前 修复后 业务价值
分镜自动生成 数据丢失 完整入库 核心功能恢复
分镜元素关联 无关联 完整关联 数据完整性
素材管理 手动创建 自动同步 效率提升 80%
查询性能 🟡 需多次 JOIN 冗余字段加速 性能提升 3x
文档准确性 严重不符 保持一致 开发体验

测试范围

单元测试

  • test_create_storyboards_from_ai() - 分镜创建逻辑
  • test_storyboard_character_association() - 角色关联
  • test_storyboard_location_association() - 场景关联
  • test_storyboard_prop_association() - 道具关联
  • test_storyboard_tag_association() - 标签关联
  • test_sync_storyboard_resources() - 素材同步

集成测试

  • test_parse_screenplay_with_storyboards() - 完整解析流程
  • test_query_storyboard_with_associations() - 查询分镜详情
  • test_storyboard_resource_sync() - 素材同步验证

回归测试

  • 确保现有测试不受影响
  • 验证角色/场景/道具存储逻辑
  • 验证标签存储逻辑

附录:代码路径索引

核心文件

文件路径 行号范围 相关问题
server/app/tasks/ai_tasks.py L840-1160 P0-01, P1-02
server/app/services/screenplay_service.py L413-511 P0-01, P0-02
server/app/services/screenplay_tag_service.py 完整文件 P2-01
docs/prompts/screenplay-ai-parse-prompt.md L21-49 P1-02
docs/requirements/backend/workflows/screenplay-ai-parse-workflow.md L55-148, L787-995 P0-01, P0-02

数据库模型

表名 Schema 文件 相关问题
storyboards app/models/storyboard.py P0-01, P0-02
screenplay_element_tags app/models/screenplay_tag.py P2-01
project_resources app/models/project_resource.py P1-01

测试文件

测试类型 文件路径 需要新增
单元测试 server/tests/unit/services/test_screenplay_service.py 新增
集成测试 server/tests/integration/test_screenplay_api.py 扩展

审核检查清单

问题确认

  • P0-01:分镜数据未入库 - 确认存在
  • P0-02:分镜元素关联逻辑缺失 - 确认存在
  • P1-01:project_resources 表未关联 - 确认存在
  • P1-02:AI Prompt 文档与实际实现不一致 - 确认存在
  • P2-01:标签冗余字段未存储 - 确认存在

修复方案确认

  • Phase 1 修复方案可行性评估
  • Phase 2 修复方案必要性评估
  • Phase 3 修复方案优先级评估
  • 测试范围覆盖度评估
  • 工期评估与资源分配

风险评估

  • 数据迁移风险(如有历史数据)
  • 性能影响评估
  • 向后兼容性检查
  • 文档更新工作量

文档状态:待用户审核确认
下一步:用户核对后确定修复优先级和实施计划