28 KiB
剧本解析接口实现问题分析报告
文档版本:v1.0
创建日期:2026-02-07
分析人员:AI Assistant
状态:待审核确认
目录
分析范围
检查对象
-
实现代码:
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(工作流文档)
检查维度
- ✅ 是否符合工作流文档的完整步骤
- ✅ 是否按照 AI Prompt 文档生成数据
- ✅ 分镜数据入口是否正确处理
- ✅ 资源入口(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
影响分析
-
功能影响:
- AI 解析返回的分镜数据(通常 10-20 个)全部丢失
- 用户无法查看 AI 生成的分镜列表
- 工作流无法闭环,步骤 10-11 完全缺失
-
数据影响:
storyboards表中没有 AI 生成的记录storyboard_id_map未生成,无法追溯- 后续基于分镜的功能(如视频合成)无法使用
-
用户体验:
- 用户触发解析后,只能看到角色/场景/道具
- 需要手动创建所有分镜,失去 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 生成的分镜
根因分析
-
Celery Task 层(
ai_tasks.pyL1088-1119):if auto_create_elements or auto_create_tags or auto_create_storyboards: # 调用 screenplay_service.store_parsed_elements() # ❌ 但该方法内部没有处理 storyboards -
Service 层(
screenplay_service.py):- 缺少
_create_storyboards_from_ai()方法 store_parsed_elements()未调用任何分镜存储逻辑
- 缺少
-
参数传递问题:
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):
- 遍历分镜数组
- 根据
characters数组中的名称,从character_id_map查找character_id - 根据
character_tags映射,构建"张三-adult"查找element_tag_id - 将
character_id写入storyboards.screenplay_character_ids数组 - 将
element_tag_id写入storyboards.element_tag_ids数组 - 对场景、道具执行相同逻辑
当前状态:
- ❌ 完全没有实现上述关联逻辑
- ❌ 无法建立分镜与角色/场景/道具的关系
- ❌ 无法建立分镜与标签的关系
影响分析
-
查询影响:
- 查询分镜时无法知道包含哪些角色
- 无法通过角色/场景反向查询相关分镜
- 无法获取分镜中角色的具体标签(少年版 vs 成年版)
-
业务影响:
- 视频合成时无法确定需要哪些素材
- 资源管理系统无法自动关联
- 分镜预览功能缺失关键信息
-
数据完整性:
- 数据库中存在孤立的分镜记录
- 无法追溯分镜与剧本元素的关系
- 违反了工作流文档定义的数据模型
数据库字段对比
| 字段名 | 类型 | 文档要求 | 当前实现 |
|---|---|---|---|
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相关的逻辑 - ❌ 分镜创建后未同步创建素材记录
- ❌ 缺少"资源入口"处理
影响分析
-
功能影响:
- 无法通过分镜查询关联的素材资源
- 素材管理系统与分镜系统脱节
- 无法实现"分镜 → 素材 → 渲染"的完整链路
-
性能影响:
- 缺少冗余字段
element_name/tag_label - 查询分镜详情时需要多次 JOIN
- 列表查询性能低下
- 缺少冗余字段
-
数据一致性:
- 素材与分镜的关联无法自动维护
- 需要额外的后台任务补全数据
预期实现
# 在存储分镜后,同步创建 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 优化 | 分批次降低消耗 | 单次消耗大 | 成本高 |
根因分析
-
文档未同步更新:
screenplay-ai-parse-prompt.md可能是旧版设计- 实际开发时简化为单阶段实现
- 未回溯更新文档
-
两阶段实现复杂度高:
- 需要前端支持中间状态展示
- 需要后端支持状态机管理
- 可能因工期压力选择简化方案
-
Token 风险评估不足:
- 之前的 Token 风险分析(
2026-02-07-token-risk-analysis.md)已指出问题 - 但未落实两阶段解析方案
- 之前的 Token 风险分析(
🟢 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
影响分析
-
查询性能:
- 每次查询分镜详情都需要 JOIN
screenplay_element_tags表 - 列表查询时性能问题严重(N+1 查询)
- 每次查询分镜详情都需要 JOIN
-
建议优化:
- 在
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 修复方案优先级评估
- 测试范围覆盖度评估
- 工期评估与资源分配
风险评估
- 数据迁移风险(如有历史数据)
- 性能影响评估
- 向后兼容性检查
- 文档更新工作量
文档状态:待用户审核确认
下一步:用户核对后确定修复优先级和实施计划