系统产品说明文档(Product Specification Document)
目录
- 1. 概述
- 2. 功能需求
- 3. 界面设计与用户体验
- 4. 数据库设计
- 5. API设计
- 6. 性能要求
- 7. 安全性要求
- 8. 日志与监控
- 9. 测试与验收
- 10. 部署与运维
- 11. 时间与计划
- 12. 附录
1. 概述
1.1 项目背景
计算机图形学(CG)行业涵盖视觉特效(VFX)、长篇动画、游戏开发及虚拟制作等领域,正处于前所未有的转折点。随着流媒体平台对 4K/8K 高分辨率内容的需求爆发,以及 VR/AR 沉浸式体验的普及,制作数据的体量与工艺复杂性呈指数级增长。
行业核心痛点:
| 痛点维度 | 现状描述 | 量化影响 |
|---|---|---|
| 数据摩擦 | 艺术家依赖 Excel 排期、FTP 传文件、邮件沟通反馈 | 平均每天 30% 时间用于非创造性劳动 |
| 工具割裂 | ShotGrid + Dropbox + Slack + Excel 多系统切换 | 信息碎片化,上下文丢失 |
| 协作低效 | 跨地域团队大文件传输慢、版本不一致 | 项目延期率高达 40% |
| 决策滞后 | 缺乏实时数据视图,问题发现时已无法挽回 | 预算超支平均 15%-25% |
| 安全隐患 | 缺乏 TPN 级安全管控,泄密风险高 | 行业每年数起重大泄密事件 |
市场需求驱动:
- 全球 VFX 市场规模预计 2027 年达到 215 亿美元(CAGR 13.2%)
- 远程/混合办公模式成为行业常态,多地协作需求激增
- AI 技术的成熟为生产流程智能化提供了可能
1.2 产品目标
系统定位为企业级、云原生的 CG 生产管理操作系统,其核心目标为:
一级目标(核心价值):
- 统一生产平台:通过单一平台整合分散的 IT 工具栈(替代 ShotGrid + Dropbox + Slack + Excel),降低总体拥有成本(TCO)40% 以上
- 无感化流程:深度集成 DCC 工具(Maya、Nuke、Houdini 等),将文件命名、版本控制、发布流程自动化,让艺术家专注创作
- 数据驱动决策:实时数据采集与 AI 分析,提供预测性商业智能(BI),在问题发生前预警
二级目标(用户体验):
- 移动化办公:通过 NEXUS Go 移动端 App,让导演和制片人随时随地审片、审批
- 智能化升级:AI 驱动的剧本拆解、生成式排期和语义化资产搜索
- 全球化协作:支持跨国、跨城市的分布式团队无缝协作
三级目标(商业竞争力):
- 安全合规:满足 MPAA/TPN 安全标准,支持完全私有化部署
- 开放生态:提供完整的 API/SDK,支持第三方开发者接入
1.3 目标用户
系统识别出 11 类核心用户角色,分为内部用户、技术用户和外部用户三大类:
内部业务用户:
| 用户角色 | 核心职责 | 使用频率 | 主要使用端 |
|---|---|---|---|
| 数字艺术家 (Artist) | 资产制作、动画、合成 | 每日 8h+ | PC桌面端(DCC插件) |
| 制片协调 (Coordinator) | 任务分发、进度追踪 | 每日 8h+ | PC Web端 |
| 视效总监 (VFX Supervisor) | 艺术指导、技术质量把控 | 每日 4-6h | PC Web端 + 移动端 |
| 导演 (Director) | 叙事指导、表演把控、创意方向决策 | 每日 2-4h | 移动端 + PC Web端 |
| 制片人 (Producer) | 预算控制、客户对接、项目运营 | 每日 2-4h | PC Web端 + 移动端 |
| 工作室高管 (Executive) | 战略决策、资源调配、经营分析 | 每周 2-3次 | 移动端 + PC Web端 |
技术与管理支撑用户:
| 用户角色 | 核心职责 | 使用频率 | 主要使用端 |
|---|---|---|---|
| 流程技术总监 (Pipeline TD) | 工具开发、流程配置、系统扩展 | 每日 4-6h | PC桌面端 + API |
| IT 管理员 (IT Admin) | 系统运维、存储管理、网络安全、边缘节点维护 | 每日 2-4h | PC Web端(管理后台) |
外部协作用户:
| 用户角色 | 核心职责 | 使用频率 | 主要使用端 |
|---|---|---|---|
| 外部客户 (Client) | 审片反馈、交付验收、需求变更 | 项目周期内不定期 | PC Web端(客户门户) |
| 外包供应商 (Vendor) | 执行分包任务、提交交付物 | 任务周期内每日 | PC Web端(受限视图) |
| 外包管理者 (Vendor Manager) | 管理外包团队、外包质量验收、成本管控 | 每日 2-4h | PC Web端 |
导演 vs 视效总监的区别:导演关注叙事节奏、演员表演和创意方向,审片时聚焦于情感表达和故事张力;视效总监关注技术质量(色彩、合成、物理准确性),审片时聚焦于画面细节和工艺标准。两者在审片系统中需要不同的工具侧重。
1.4 目标平台
系统采用三端一体的产品架构,确保核心功能跨平台一致性:
┌─────────────────────────────────────────────────────────────┐
│ 系统三端架构 │
├──────────────────┬──────────────────┬───────────────────────┤
│ PC Web 端 │ PC 桌面应用端 │ 移动端 │
│ │ │ │
│ • 全功能管理界面 │ • DCC 插件面板 │ • NEXUS Go App │
│ • 审片播放器 │ • 本地文件操作 │ • 审片 + 管理双模式 │
│ • BI 仪表盘 │ • 桌面通知 │ • 离线支持 │
│ • 客户门户 │ • 高性能渲染预览 │ • 触控批注 │
│ │ │ │
│ 浏览器: │ 操作系统: │ 平台: │
│ Chrome/Firefox/ │ Windows 10+ │ iOS 15+ / Android 12+ │
│ Safari/Edge │ macOS 12+ │ iPadOS 15+ │
│ │ Linux (Ubuntu │ │
│ │ 20.04+/CentOS 7+)│ │
└──────────────────┴──────────────────┴───────────────────────┘
平台功能覆盖矩阵:
| 功能模块 | PC Web端 | PC桌面端 | 移动端 |
|---|---|---|---|
| 任务管理 | 完整 | 只读面板 | 查看+状态更新 |
| 文件管理 | 完整 | 完整+本地VFS | 只读浏览 |
| 流程自动化 | 完整 | 事件触发 | 审批操作 |
| 通讯协作 | 完整 | 精简面板 | 完整 |
| 统计与BI | 完整 | - | 关键指标仪表盘 |
| 插件集成 | API文档 | 完整(DCC面板) | - |
| 审片反馈 | 完整 | RV/Hiero集成 | 完整(触控优化) |
| 多地协作 | 管理配置 | 缓存节点管理 | 状态监控 |
| AI模块 | 完整 | 插件内调用 | 搜索+语音 |
1.5 商业与市场
商业模式、市场规模分析、竞争格局、财务预测、市场进入策略、团队与融资计划等内容, 请参阅配套文档:系统商业计划书(Business Plan)
2. 功能需求
2.1 功能模块总览
系统的功能体系分为十大核心模块、三大扩展能力和十七项基础支撑功能:
┌─────────────────────────────────────────────────────────────────────┐
│ 系统功能架构全景图(v2.0) │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 任务管理 │ │ 文件管理 │ │ 流程自动化│ │ 通讯协作 │ │ 统计与BI │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 插件集成 │ │ 审片反馈 │ │ 多地协作 │ │ 外包管理 │ │ 交付管理 │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ 十大核心模块 │
│ │
│ ┌───────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 移动端NEXUS Go │ │ AI 智能化 │ │ 开发者生态 │ 三大扩展 │
│ └───────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 用户权限 | 系统管理 | 通知引擎 | 全局搜索 | 审计日志 │ │
│ │ 数据迁移 | 国际化 | 自定义配置| 文件预览 | 客户门户 │ │
│ │ 渲染集成 | 回收站 | 收藏访问 | 帮助引导 | 产能规划 │ │
│ │ Showreel | 技能档案 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ 十七项基础支撑 │
└─────────────────────────────────────────────────────────────────────┘
2.2 核心模块一:任务管理系统 (Task Management)
2.2.1 功能描述
任务管理是 CG 生产的核心引擎,专为 CG 非线性流程设计,处理极为复杂的依赖关系(模型→绑定→动画→解算→灯光→合成),支持高并发的资产与镜头关联。
2.2.2 多层级实体架构
系统支持无限层级的树状结构,适应电影、剧集、游戏等不同项目类型:
| 实体层级 | 描述 | 关键属性 |
|---|---|---|
| 项目 (Project) | 顶层容器 | 全局设置(分辨率、帧率、色彩空间)、状态、起止日期 |
| 场次/序列 (Sequence) | 镜头的逻辑分组 | 编号、描述、组任务管理(如全场次灯光预设) |
| 镜头 (Shot) | 最小时间单位实体 | 帧范围(Frame Range)、缩略图、剪辑状态、镜头类型 |
| 资产 (Asset) | 跨镜头复用实体 | 类型(角色/道具/场景)、变体(Variation)管理 |
| 任务 (Task) | 分配给艺术家的工作单元 | 状态、优先级、预估工时、实际工时、指派人 |
任务状态流转:
Waiting to Start → Ready to Start → In Progress → Pending Review → Approved / Retake
↓
Final (锁定)
业务规则:
- BR-TASK-001:任务状态变更须遵循预定义的状态流,不允许跳跃(如从"Waiting"直接到"Final")
- BR-TASK-002:当上游任务未达到"Approved"时,下游任务不可进入"In Progress"状态(可配置为软约束或硬约束)
- BR-TASK-003:任务指派须校验被指派人是否属于对应部门且具有相应技能标签
- BR-TASK-004:标记为"Final"的任务自动锁定,不可修改(需管理员解锁)
- BR-TASK-005:支持任务批量创建(通过 CSV 导入或模板复制),单次批量上限 5,000 条
2.2.3 甘特图 2.0 与弹性排期
功能描述: 引入"弹性依赖"机制,解决传统甘特图在频繁变更中的僵化问题。
| 子功能 | 描述 | 交互方式 |
|---|---|---|
| 逻辑链接 | 支持 FS/SS/FF 及滞后时间(Lag) | 拖拽连线建立依赖关系 |
| 自动推演 | 上游延期时自动计算下游连锁影响 | "幽灵条(Ghost Bar)"显示预测延期 |
| 基线对比 | 初始计划 vs 实际执行叠加对比 | 切换"基线视图"按钮 |
| 关键路径高亮 | 自动识别并高亮项目关键路径 | 颜色标记 + 筛选器 |
| 里程碑标记 | 在时间轴上标记关键交付节点 | 菱形图标 + 弹窗详情 |
业务规则:
- BR-GANTT-001:依赖关系变更时,系统在 3 秒内完成全链路推演并刷新UI
- BR-GANTT-002:幽灵条需经制片人确认后才会更新为正式排期
- BR-GANTT-003:基线计划在项目启动时自动生成快照,不可修改
- BR-GANTT-004:支持按 天/周/月/季度 四种时间粒度切换
异常处理:
- 循环依赖检测:创建依赖时实时检测是否形成环路,若检测到则阻止操作并提示
- 资源冲突警告:同一艺术家在同一时间段被分配多个任务时发出黄色警告
2.2.4 敏捷看板与电子表格视图
看板视图(Kanban):
- 功能描述:卡片式展示任务,支持拖拽改变状态,适合资产部门处理大量碎片化任务
- 交互描述:
- 拖拽卡片从一列移到另一列即改变任务状态
- 卡片展示缩略图、任务名、指派人头像、优先级色标
- 支持自定义泳道(按部门/优先级/指派人分组)
- 右键菜单支持快速操作(指派、设置优先级、添加标签)
电子表格视图(Spreadsheet View):
- 功能描述:Excel 的超级替代品,支持百万级单元格流畅渲染
- 核心能力:
- 批量编辑:框选多个单元格同时修改
- 公式计算:如
Cost = Days * DailyRate - 条件格式:如"超过 3 天未更新状态显示红色"
- 冻结行/列:固定表头和关键列
- 列自定义:用户可增删、排序、调整列宽
- 批量操作详细交互:
- 批量状态变更:框选多行 → 右键 → "批量修改状态" → 选择目标状态 → 确认
- 批量指派:框选多行 → 右键 → "批量指派" → 选择艺术家 → 确认(自动检查技能匹配)
- 批量优先级:框选多行 → 右键 → "设置优先级" → 选择级别
- 批量移动:框选多行 → 右键 → "移动到序列/资产" → 选择目标 → 确认
- 批量日期调整:框选多行 → 右键 → "批量调整日期" → 整体前移/后移 N 天
- 业务规则:
- BR-SHEET-001:批量编辑操作记录在审计日志中,支持一键撤销
- BR-SHEET-002:公式仅支持预定义的安全函数集,禁止任意代码执行
- BR-SHEET-003:批量操作上限 500 条/次,超过需分批执行(防止误操作)
2.2.5 资源日历视图 (Resource Calendar)
功能描述: 以"人"为维度组织的日历视图,展示每位艺术家的任务排班。制片协调使用此视图识别空闲资源和排期冲突。
| 子功能 | 描述 | 交互方式 |
|---|---|---|
| 人员时间线 | 纵轴为人员列表,横轴为时间,色块为任务 | 类似甘特图但按人组织 |
| 空闲识别 | 无任务分配的时间段自动高亮 | 灰色空白区域 |
| 超负荷警告 | 每日分配超过 8 小时的人员标红 | 红色高亮 + 警告图标 |
| 拖拽指派 | 将任务拖拽到某人的空闲时段 | 直接拖拽操作 |
| 部门筛选 | 按部门/技能标签过滤显示 | 顶部筛选器 |
| 多项目叠加 | 同一人在不同项目的任务以不同颜色显示 | 颜色图例 |
| 请假/不可用 | 显示人员请假、培训等不可用时段 | 斜线填充区域 |
业务规则:
- BR-CAL-001:资源日历数据与甘特图实时联动,任一视图的修改另一个视图同步更新
- BR-CAL-002:请假/不可用数据可由HR系统通过API同步,或由制片协调手动录入
- BR-CAL-003:当拖拽指派导致某人超负荷时,弹出确认对话框警告
2.2.6 镜头网格视图 (Shot Grid View)
功能描述: 以网格形式展示序列下所有镜头的状态总览,每个格子代表一个镜头的一个环节,颜色代表完成状态。这是视效总监最高频使用的视图。
Anim Light Comp Final
SH010 ■绿 ■黄 □灰 □灰
SH020 ■绿 ■绿 ■黄 □灰
SH030 ■红 □灰 □灰 □灰
SH040 ■黄 □灰 □灰 □灰
| 子功能 | 描述 |
|---|---|
| 状态色块 | 绿=完成、黄=进行中、红=延期/返修、灰=未开始、蓝=审核中 |
| 点击查看详情 | 点击任意色块弹出任务详情/最新版本缩略图 |
| 缩略图模式 | 切换为缩略图网格,每格显示最新版本的缩略图 |
| 筛选过滤 | 按状态、部门、指派人过滤 |
| 导出为图片 | 将网格截图导出为 PNG(用于会议演示) |
业务规则:
- BR-GRID-001:网格视图默认按剪辑顺序(cut_order)排列镜头
- BR-GRID-002:支持自定义显示哪些环节列(如隐藏不相关的部门)
2.3 核心模块二:文件管理系统 (File Management)
2.3.1 功能描述
文件管理是 CG 流程的基石。系统通过"虚拟文件系统(VFS)"接管文件的完整生命周期,确保"正确的文件在正确的地方"。
2.3.2 虚拟文件系统 (VFS) 与存储抽象
| 子功能 | 描述 | 技术实现 |
|---|---|---|
| 逻辑挂载 | 系统内部使用逻辑路径 $SHOW_ROOT/seq/shot/task/v001 |
客户端根据 OS 自动解析物理路径 |
| 云/地混合存储 | 本地 NAS + 云对象存储透明分层 | 热数据本地,冷数据自动迁移至云端 |
| 回取触发 | 云端文件在管理器中可见,点击触发回取 | 异步下载 + 进度条展示 |
| 跨平台路径 | 解决 Z:\Projects vs /mnt/projects 不一致 |
环境变量自动解析引擎 |
业务规则:
- BR-VFS-001:逻辑路径到物理路径的映射规则由 Pipeline TD 在系统管理后台配置
- BR-VFS-002:冷数据迁移策略可按项目配置(如"项目结项后 30 天自动迁移")
- BR-VFS-003:云端文件回取优先级与当前任务优先级关联(高优先级任务文件优先回取)
2.3.3 自动化命名规范与目录结构
Schema 定义引擎:
Pipeline TD 可通过 YAML 或 UI 定义命名规则:
# 命名规范示例
naming_schema:
pattern: "{Project}_{Sequence}_{Shot}_{Department}_v{Version:03d}"
extension_whitelist: [".ma", ".mb", ".nk", ".hip", ".psd", ".exr"]
example: "NEXUS_SQ010_SH005_Anim_v003.ma"
# 目录结构模板
directory_template:
shot:
- publish/ # 已审核发布的文件
- work/ # 工作中的文件
- caches/ # 缓存文件(Alembic/VDB等)
- renders/ # 渲染输出
- plates/ # 实拍素材
- reference/ # 参考资料
业务规则:
- BR-NAME-001:不符合命名规范的文件禁止通过"Smart Publish"发布(可配置为警告或阻止)
- BR-NAME-002:创建新镜头/资产时自动生成标准目录树并设置读写权限
- BR-NAME-003:命名规范支持项目级自定义,不同项目可使用不同规则
2.3.4 版本控制与资产锁定
| 子功能 | 描述 | 交互方式 |
|---|---|---|
| 版本号管理 | 发布时自动递增版本号 | 发布面板显示当前版本并自动+1 |
| Check-out/Check-in | 二进制文件的并发写入锁定 | "编辑"按钮自动锁定,保存后释放 |
| 锁定状态显示 | 被锁定文件显示锁定者信息 | 锁图标 + 悬浮提示锁定者/时间 |
| 依赖关系追踪 | 记录文件间引用"族谱" | 可视化依赖图谱 |
| 上游变更通知 | 被引用文件更新时通知下游 | "输入素材已更新"横幅 + 一键更新 |
业务规则:
- BR-VER-001:版本号不可手动修改,仅可通过系统发布流程自动递增
- BR-VER-002:锁定超过 24 小时未释放的文件,系统自动通知锁定者和其主管
- BR-VER-003:删除文件版本需要管理员权限,且删除后进入回收站(保留 90 天)
- BR-VER-004:依赖图谱支持最多 5 层深度的追溯
异常处理:
- 锁冲突:当艺术家 A 锁定文件后意外断线,管理员可强制释放锁
- 版本回滚:支持将当前发布版本回退到任意历史版本,回退操作记入审计日志
2.3.5 版本差异对比工具 (Scene Diff)
功能描述: 艺术家在进行版本迭代时,需要清楚了解两个版本之间的具体差异。系统提供针对 DCC 场景文件的结构化差异对比。
| 对比类型 | 支持格式 | 展示方式 |
|---|---|---|
| 节点树差异 | Maya (.ma/.mb), Houdini (.hip) | 树形结构标记新增/删除/修改的节点 |
| 参数变更 | 所有 DCC 格式 | 表格列出变更属性(旧值→新值) |
| 依赖变更 | Nuke (.nk), Houdini (.hip) | 节点图中高亮变更的连接关系 |
| 视觉对比 | 缩略图/Playblast | 分屏/叠化/滑动对比 |
| 文件元数据 | 所有格式 | 文件大小、引用列表、插件依赖变更 |
交互描述:
- 在 Version Navigator 中选择两个版本,点击"对比"按钮
- 差异结果以颜色标记:绿色=新增、红色=删除、黄色=修改
- 支持过滤器(仅显示几何体变更/仅显示材质变更/仅显示动画变更)
业务规则:
- BR-DIFF-001:场景 Diff 结果可导出为 PDF 报告,附加到任务评论中
- BR-DIFF-002:对于二进制格式(.mb),仅支持元数据级别对比和视觉对比
2.3.6 参考资料板 (Reference Board)
功能描述: 为项目/资产/镜头组织视觉参考资料(Mood Board),支持团队共享和讨论。
| 子功能 | 描述 | 交互方式 |
|---|---|---|
| 参考集合创建 | 创建主题化的参考集合(如"角色服装参考"、"城市夜景参考") | 拖拽图片/URL 到画布 |
| 多来源导入 | 支持本地图片、网页截图、URL 链接、系统内已有资产 | 拖拽 + 粘贴 + 浏览导入 |
| 画布标注 | 在参考图上添加标注说明 | 画笔/文字/箭头工具 |
| 关联实体 | 将参考集合关联到项目/资产/镜头 | 实体选择器 |
| 团队共享 | 参考集合可设置为团队可见或个人私有 | 权限开关 |
| DCC 内查看 | 在 DCC 插件面板中浏览当前任务关联的参考 | NEXUS Panel 内嵌查看 |
业务规则:
- BR-REF-001:参考集合支持版本(总监可更新参考方向,历史版本保留)
- BR-REF-002:网络图片导入时自动下载保存到本地存储,避免外链失效
2.3.7 创意方向板 (Creative Brief)
功能描述: 为项目/场次/资产设定视觉风格指引和创意方向文档,由导演或视效总监创建,团队成员可引用作为制作依据。
| 子功能 | 描述 |
|---|---|
| 风格指引 | Mood Board 画板(色彩调性、光影风格、参考影片截图) |
| 文字简报 | 创意方向的文字说明(支持富文本) |
| 色彩方向 | 主色调参考板 + 色彩范围指引 |
| 分层级指引 | 项目级(整体风格)→ 序列级(场景氛围)→ 资产级(角色设计) |
| 版本追踪 | 创意方向的变更历史,旧版本保留可追溯 |
| 团队通知 | 创意方向更新时自动通知相关团队成员 |
业务规则:
- BR-BRIEF-001:创意方向板仅 Director 和 Supervisor 可创建和编辑
- BR-BRIEF-002:创意方向变更需要通知所有关联的在进行中任务的艺术家
- BR-BRIEF-003:创意方向板在 DCC 插件面板中以只读方式展示
2.3.8 结构化反馈表单 (Structured Feedback)
功能描述: 除了自由绘制的帧级批注外,提供结构化的反馈选项模板,降低沟通歧义,特别适用于客户反馈场景。
| 反馈维度 | 选项示例 |
|---|---|
| 动画节奏 | 太快 / 合适 / 太慢 |
| 色彩倾向 | 偏暖 / 合适 / 偏冷 |
| 动作幅度 | 太大 / 合适 / 太小 |
| 整体评价 | 通过 / 小修改后通过 / 需要返修 / 重做 |
| 优先级 | 必须修改 / 建议修改 / 可忽略 |
交互描述:
- 审片时在批注面板中切换"自由批注"和"结构化反馈"两种模式
- 结构化反馈可绑定到具体帧范围
- 反馈模板可由 Supervisor/Producer 自定义(不同项目可用不同模板)
- 结构化反馈数据可汇总统计(如"客户反馈中 60% 提到色彩偏暖")
2.4 核心模块三:流程自动化 (Workflow Automation)
2.4.1 功能描述
负责连接各个功能孤岛,实现数据的自动流转。系统提供可视化的 DAG(有向无环图)工作流引擎和事件触发器。
2.4.2 DAG 工作流引擎
可视化节点编辑器:
- 每个节点代表一个部门或步骤(如"高模"→"低模"→"UV"→"贴图")
- 连线定义节点间的依赖逻辑
- 门禁系统 (Quality Gates):节点间设置自动检查关卡
| 门禁类型 | 检查内容 | 触发时机 |
|---|---|---|
| 几何体检查 | 非流形几何体、翻转法线、孤立顶点 | 模型发布到绑定前 |
| 命名规范检查 | 节点/材质命名是否符合规范 | 任何发布操作前 |
| 帧数检查 | 动画帧范围是否匹配镜头设定 | 动画发布前 |
| 分辨率检查 | 渲染输出分辨率是否正确 | 灯光/合成发布前 |
| 自定义脚本 | Pipeline TD 编写的自定义验证 | 可配置 |
交互描述:
- 拖拽方式添加节点,连线建立依赖
- 双击节点编辑属性(状态映射、门禁规则)
- 右键菜单添加/删除门禁检查
- 支持工作流模板的保存和复用
业务规则:
- BR-WF-001:工作流变更需通过审批流程(至少一名 Supervisor 确认)
- BR-WF-002:门禁检查失败时,发布操作被阻止,错误详情推送给发布者
- BR-WF-003:工作流支持版本控制,修改后旧版本保留,进行中的任务不受新版本影响
2.4.3 事件触发器 (Triggers)
基于"If This Then That"逻辑的自动化引擎:
预置场景:
| 场景 | 触发条件 | 执行动作 |
|---|---|---|
| 自动转码与上传 | 合成师设任务状态为"Pending Review" | 1. 调用渲染农场生成 MP4 代理 2. 上传至审片模块 3. 通知总监 |
| 跨部门返修 | 动画任务标记为"Retake" | 1. 创建返修任务 2. 附带总监批注 3. 指派原动画师 4. 优先级设为 High |
| 资产发布联动 | 角色模型发布新版本 | 1. 通知所有引用该角色的下游镜头 2. 生成更新建议 |
| 磁盘空间预警 | 存储使用率超过 85% | 1. 通知 IT 管理员 2. 触发冷数据迁移策略 |
| 里程碑提醒 | 距里程碑截止日 ≤ 3 天 | 1. 统计未完成任务 2. 推送汇总邮件给制片人 |
自定义触发器:
- 支持 Pipeline TD 通过 Python 脚本编写自定义触发器
- 提供触发器调试模式(Dry Run),可预览执行结果而不实际执行
- 触发器执行日志可查询(包含执行时间、状态、错误信息)
异常处理:
- 触发器执行失败时自动重试(最多 3 次,间隔 30s/60s/120s)
- 连续失败后发送告警邮件给系统管理员
- 支持手动触发重跑
2.4.4 沙盒/测试环境 (Sandbox)
功能描述: 为 Pipeline TD 提供与生产环境隔离的沙盒环境,用于开发和测试新的工作流配置、门禁脚本和触发器。
| 子功能 | 描述 |
|---|---|
| 沙盒项目 | 创建独立的沙盒项目,包含模拟数据 |
| 配置克隆 | 从生产项目复制工作流/触发器/命名规范到沙盒 |
| 安全执行 | 沙盒中的触发器不会发送真实通知或修改生产数据 |
| 日志与调试 | 增强的调试日志(变量值、执行路径、性能计时) |
| 一键发布 | 测试通过后将配置从沙盒发布到生产环境(需审批) |
业务规则:
- BR-SAND-001:沙盒环境与生产环境完全数据隔离
- BR-SAND-002:沙盒中的脚本执行有资源限制(CPU/内存/超时时间)
- BR-SAND-003:从沙盒发布到生产需要至少一名 Supervisor 审批
2.4.5 工作流文档自动生成
功能描述: TD 配置好 DAG 工作流后,系统自动生成面向艺术家的可视化操作指南文档。
| 输出内容 | 描述 |
|---|---|
| 流程图 | 自动生成工作流的可视化流程图(SVG/PNG) |
| 步骤说明 | 每个环节的操作说明(发布规范、输入输出要求) |
| 门禁清单 | 每个环节需要通过的检查项列表 |
| 状态说明 | 各状态的含义和流转规则 |
| 输出格式 | 可导出为 PDF / HTML / 在线知识库页面 |
2.5 核心模块四:通讯与协作 (Communication)
2.5.1 功能描述
解决"信息碎片化"问题,确保所有沟通发生在具体的"上下文"中,消除跨工具切换的信息损耗。
2.5.2 上下文感知聊天 (Context-Aware Chat)
| 子功能 | 描述 | 交互方式 |
|---|---|---|
| 实体频道 | 每个项目/场次/镜头/资产自动拥有专属聊天频道 | 左侧树形导航进入对应频道 |
| 深度链接 | 聊天中引用系统内任何实体 | 输入 # 搜索任务,@ 提及用户 |
| 富文本消息 | 支持 Markdown、代码块、表格 | 编辑器工具栏 |
| 文件分享 | 直接在聊天中分享文件版本 | 拖拽文件或点击附件按钮 |
| 消息回复/线程 | 支持针对特定消息回复,形成讨论线程 | 悬浮菜单点击"回复" |
| 消息置顶 | 重要消息置顶显示 | 管理员/频道主可操作 |
业务规则:
- BR-CHAT-001:聊天消息自动关联到对应实体的活动日志
- BR-CHAT-002:
#引用支持跨项目搜索(权限范围内) - BR-CHAT-003:文件分享时自动检查接收方是否有对应权限
- BR-CHAT-004:聊天记录永久保留,支持全文搜索
2.5.3 统一收件箱 (Action Center)
聚合所有来源的消息并按优先级智能排序:
| 消息类型 | 来源 | 优先级 |
|---|---|---|
| @提醒 | 同事在聊天/批注中提及 | 高 |
| 审批请求 | 流程模块触发 | 高 |
| 任务状态变更 | 自己关注的任务有更新 | 中 |
| 系统通知 | 渲染完成、文件发布、空间预警 | 中 |
| 每日汇总 | 系统自动生成 | 低 |
交互描述:
- 支持"关注(Follow)"机制,用户只接收自己关注的资产动态
- 支持"已读/未读"标记和批量标记
- 支持按类型、时间、项目筛选
- 点击通知直接跳转到对应实体详情页
2.6 核心模块五:统计与商业智能 (Statistics & BI)
2.6.1 功能描述
挖掘生产过程海量数据,为决策者提供可视化支持与预测性分析。
2.6.2 生产效能仪表盘
| 图表类型 | 用途 | 数据源 |
|---|---|---|
| 燃尽图 (Burndown) | 剩余任务量 vs 剩余时间 | 任务状态变更记录 |
| 速率图 (Velocity) | 团队每周完成任务量趋势 | 任务完成时间戳 |
| 配额追踪 (Quota) | 实际产出 vs 目标配额 | 工时记录 + 任务完成数 |
| 部门负载热力图 | 各部门当前任务负载 | 任务分配数据 |
| 资源利用率 | 艺术家工时利用率 | Timesheet 数据 |
业务规则:
- BR-BI-001:仪表盘数据每 5 分钟自动刷新(可手动刷新)
- BR-BI-002:配额统计支持按周/月/季度切换
- BR-BI-003:燃尽图斜率平缓时自动触发"延期风险"预警
2.6.3 财务与工时分析
| 子功能 | 描述 | 输出 |
|---|---|---|
| Bid vs Actual | 报价单数据与实际工时对比 | 按镜头/场次/部门维度的毛利损耗报表 |
| 超支预警 | 资产制作时长超平均值 150% 时预警 | 自动通知制片人 |
| Timesheet | 艺术家每日工时填写 | 工时汇总报表 |
| 成本归集 | 按项目/镜头/资产归集人工成本 | 项目成本明细表 |
业务规则:
- BR-FIN-001:Timesheet 每日必填,超过 48 小时未填写系统自动提醒
- BR-FIN-002:报表数据支持导出为 PDF/Excel/CSV 格式
- BR-FIN-003:财务数据仅对制片人及以上角色可见
2.6.4 个人效能面板 (My Performance)
功能描述: 面向艺术家的个人工作数据看板,帮助自我管理和成长追踪。每位用户仅可查看自己的数据。
| 指标 | 描述 | 展示方式 |
|---|---|---|
| 本周/本月完成任务数 | 已完成任务的数量趋势 | 折线图 + 与上周对比 |
| 返修率 (Retake Rate) | Retake 次数 / 总审批次数 | 百分比 + 趋势 |
| 平均完成用时 | 每个任务从开始到完成的平均天数 | 按部门/任务类型细分 |
| 工时填写完整度 | Timesheet 填写天数 / 工作日天数 | 进度条 |
| 技能标签进展 | 个人技能标签的成长记录 | 雷达图 |
| 个人里程碑 | 自定义的个人目标追踪 | 清单 + 完成状态 |
业务规则:
- BR-PERF-001:个人效能数据仅本人和其直属主管可见,不公开排名
- BR-PERF-002:返修率等敏感指标仅展示趋势方向,不作为 KPI 考核依据(可配置)
- BR-PERF-003:个人面板在 DCC 插件面板的 My Stats 标签页中也可查看精简版
2.6.5 自动日报/周报生成 (Auto Report)
功能描述: 系统根据当日/当周的任务状态变更、审片结果、工时数据,自动生成结构化的生产报告,减少制片协调手动整理的时间。
| 报告类型 | 内容 | 生成频率 | 接收人 |
|---|---|---|---|
| 每日生产日报 (DPR) | 今日完成任务、新增返修、阻塞问题、明日计划 | 每日下班时自动生成 | 制片协调、制片人 |
| 周报 | 本周完成/计划对比、里程碑进展、超时任务、资源利用率 | 每周五自动生成 | 制片人、Supervisor |
| 里程碑报告 | 里程碑达成情况、剩余工作量、风险预警 | 里程碑前 3 天 | 制片人、高管 |
| 项目月报 | 预算消耗、进度偏差、质量指标(返修率)、资源统计 | 每月初自动生成 | 高管、制片人 |
交互描述:
- 自动生成的报告推送到收件箱,可在线查看或导出 PDF
- 报告内容可手动编辑补充(如添加制片协调的主观评价)
- 支持自定义报告模板(选择包含哪些数据模块)
业务规则:
- BR-RPT-001:自动报告仅包含系统内可量化数据,主观评价部分留白供人工填写
- BR-RPT-002:报告历史永久保存,可按日期检索
2.6.6 高管经营仪表盘 (Executive Dashboard)
功能描述: 专为工作室高管设计的战略级数据视图,聚焦经营指标和产能分析。
| 指标分类 | 具体指标 | 数据来源 |
|---|---|---|
| 财务概览 | 季度/年度营收趋势、项目利润率分布、应收账款 | 报价管理 + 工时数据 |
| 产能分析 | 各部门负载率、闲置资源、未来 3 月产能预测 | 任务排期 + 人员数据 |
| 项目健康度 | 在运行项目数、延期/超支项目占比、客户满意度 | 任务/BI/客户反馈 |
| 人力资源 | 团队规模趋势、部门人数分布、技能分布热力图 | 用户管理 + 技能档案 |
| 业务发展 | 竞标中标率、报价准确性、新客户获取率 | 报价管理 |
| 质量指标 | 全工作室平均返修率、一次通过率 | 审片数据 |
交互描述:
- 全屏仪表盘模式,支持投影到会议室大屏
- 所有指标支持下钻(如点击"延期项目"查看延期原因明细)
- 支持时间范围切换(本月/本季/本年/自定义)
- 移动端提供精简版卡片式展示
业务规则:
- BR-EXEC-001:高管仪表盘数据仅对 Admin 和 Producer 及以上角色可见
- BR-EXEC-002:产能预测基于历史效率数据和当前排期的 AI 推算
2.6.7 多项目组合视图 (Portfolio View)
功能描述: 面向管理多个项目的制片人,提供跨项目的全局概览和对比分析。
| 子功能 | 描述 |
|---|---|
| 项目健康度矩阵 | 所有在运行项目的进度/预算/质量三维评分,颜色标识健康状态 |
| 跨项目资源视图 | 查看同一个艺术家在不同项目间的时间分配 |
| 里程碑时间线 | 所有项目的关键里程碑在同一时间线上展示 |
| 预算汇总 | 所有项目的预算消耗汇总与剩余预算 |
| 风险热力图 | 跨项目的风险分布概览 |
2.6.8 报价与竞标管理 (Bidding Management)
功能描述: 管理项目竞标全流程,从镜头复杂度评估到报价单生成,为 Bid vs Actual 分析提供完整的数据源。
| 子功能 | 描述 | 操作角色 |
|---|---|---|
| 镜头复杂度评估 | 对每个镜头/资产标记复杂度等级(简单/中等/复杂/极复杂) | Supervisor |
| 工时估算模板 | 按部门/复杂度配置标准工时模板(如"复杂角色模型=15人天") | Producer |
| 报价单生成 | 基于评估结果自动生成报价单,支持手动调整 | Producer |
| 版本管理 | 报价单支持多版本(初版/修订版),保留完整历史 | Producer |
| 报价对比 | 同一项目的不同报价版本横向对比 | Producer |
| 导出 | 导出为 PDF/Excel 格式的正式报价文档 | Producer |
业务规则:
- BR-BID-001:报价单确认后锁定,修改需创建新版本
- BR-BID-002:报价数据自动流入 Bid vs Actual 分析模块
- BR-BID-003:历史报价数据用于 AI 排期模块的工时估算
2.6.9 变更管理 (Change Order Management)
功能描述: 当客户在项目进行中提出需求变更时,管理变更请求的评估、审批和预算追踪。
| 变更流程阶段 | 描述 | 操作角色 |
|---|---|---|
| 变更提交 | 客户通过客户门户或制片人手动录入变更请求 | Client / Producer |
| 影响评估 | Supervisor 评估变更对工期/成本的影响 | Supervisor |
| 费用重估 | 基于影响评估生成追加报价 | Producer |
| 审批 | 内部审批(Producer/高管)+ 客户确认 | Producer / Client |
| 执行 | 审批通过后自动创建新任务并调整排期 | 系统自动 |
| 追踪 | 变更产生的额外成本单独归集追踪 | Producer |
业务规则:
- BR-CO-001:变更请求关联到具体的镜头/资产/任务
- BR-CO-002:变更产生的额外费用独立于原始报价记账
- BR-CO-003:变更历史完整保留,支持导出为合同附件
2.6.10 风险登记册 (Risk Register)
功能描述: 除系统自动预警外,制片人手动记录和追踪项目风险,评估影响和制定应对措施。
| 风险属性 | 描述 |
|---|---|
| 风险描述 | 自由文本描述风险内容 |
| 风险类别 | 进度/预算/人员/技术/外部 |
| 影响程度 | 低/中/高/极高 |
| 发生概率 | 低/中/高 |
| 风险等级 | 自动计算(影响 x 概率) |
| 应对措施 | 描述应对策略和负责人 |
| 状态 | 开放/监控中/已缓解/已关闭 |
| 关联实体 | 关联到具体项目/任务/人员 |
业务规则:
- BR-RISK-001:高风险和极高风险项自动推送给制片人和高管
- BR-RISK-002:风险状态每周需要更新确认(超过 7 天未更新系统提醒)
- BR-RISK-003:风险数据汇入项目组合视图的风险热力图
2.6.11 项目复盘工具 (Post-Mortem)
功能描述: 项目结束后的复盘工具,自动汇总项目全周期数据并提供结构化的经验教训记录。
| 自动汇总数据 | 描述 |
|---|---|
| 进度偏差 | 原始计划 vs 实际完成的时间对比 |
| 预算偏差 | 报价金额 vs 实际成本 |
| 返修率统计 | 按部门/环节的返修率分布 |
| 资源效率 | 实际人效 vs 历史基准 |
| 变更统计 | 变更次数、变更金额占比 |
| 交付质量 | 客户反馈汇总、一次通过率 |
人工输入内容:
| 复盘模块 | 描述 |
|---|---|
| 做得好 (What went well) | 团队投票 + 自由描述 |
| 待改进 (What to improve) | 团队投票 + 自由描述 |
| 行动计划 (Action items) | 具体改进措施和负责人 |
| 经验沉淀 | 可复用的流程改进写入知识库 |
业务规则:
- BR-PM-001:复盘报告在项目结项后 2 周内必须完成
- BR-PM-002:复盘中识别的行动计划自动创建为跟踪任务
- BR-PM-003:历史复盘数据可跨项目检索,用于新项目参考
2.6.12 客户沟通记录 (Client Communication Log)
功能描述: 管理与外部客户的沟通记录,确保重要决策和反馈不丢失。
| 子功能 | 描述 |
|---|---|
| 会议纪要 | 记录每次客户会议的讨论内容和决策结果 |
| 决策追踪 | 标记关键决策(如"客户确认角色外形方案A"),可追溯 |
| 邮件存档 | 关键邮件手动存档到项目记录中 |
| 沟通时间线 | 按时间轴展示所有客户沟通记录 |
| 关联实体 | 将沟通记录关联到具体镜头/资产/变更请求 |
业务规则:
- BR-CLIENT-001:客户会议纪要在会后 24 小时内录入
- BR-CLIENT-002:关键决策需客户书面确认(可在客户门户中确认)
2.7 核心模块六:插件集成与 API (Plugins & Integrations)
2.7.1 功能描述
通过统一框架的 DCC 插件实现与艺术家工作环境的无缝集成,同时提供完整的 API 生态支撑二次开发。
2.7.2 NEXUS Panel(DCC 应用内面板)
支持的 DCC 软件:Maya、3ds Max、Nuke、Houdini、Unreal Engine、Photoshop、After Effects
| 面板功能 | 描述 | 交互方式 |
|---|---|---|
| My Tasks | 查看分配给自己的任务列表 | 面板内列表,点击切换任务上下文 |
| Asset Loader | 可视化资产浏览器 | 搜索+缩略图,双击自动导入最新版本 |
| Smart Publish | 一键发布工具 | 点击发布按钮,自动执行全流程 |
| Scene Setup | 自动加载项目预设环境 | 新建/打开场景时自动配置单位、帧率、渲染器、色彩空间 |
| Version Navigator | 浏览当前任务的历史版本 | 版本列表 + 缩略图对比 |
| Notes Panel | 查看总监反馈批注 | 在面板内显示帧级批注标记 |
| Timesheet | DCC 内填写每日工时 | 弹出轻量表单,选任务+填时长+备注,支持计时器模式 |
| My Stats | 个人效能概览 | 本周完成数/返修率/平均用时/趋势图 |
| Work Notes | 个人工作日志 | 富文本笔记,关联到当前任务,仅本人可见 |
Scene Setup 功能详情:
当艺术家在 DCC 中创建新场景或打开已有场景时,Scene Setup 自动执行以下配置:
| 配置项 | 说明 | 数据来源 |
|---|---|---|
| 场景单位 | 自动设置为项目定义的单位制(cm/m/inch) | 项目全局设置 |
| 帧率 (FPS) | 自动设置帧率(24/25/30/48) | 项目全局设置 |
| 帧范围 | 根据当前任务关联的镜头设置起止帧 | 镜头实体属性 |
| 渲染器配置 | 加载项目指定的渲染器预设 | 项目模板/Pipeline TD 配置 |
| 色彩空间 | 设置 OCIO 配置文件路径 | 项目 OCIO 配置 |
| 输出路径 | 自动填入标准渲染输出路径 | VFS 路径模板 |
业务规则:
- BR-SETUP-001:Scene Setup 在每次打开场景时执行环境检查,不一致时弹出警告而非静默修正
- BR-SETUP-002:艺术家可选择"跳过本次检查",但操作会记录到审计日志
Smart Publish 自动执行流程:
场景清理 → 缩略图截取 → Playblast 生成 → 门禁检查 → 版本号递增
→ 文件上传 → 数据库记录更新 → 状态变更 → 通知下游
业务规则:
- BR-PLUGIN-001:Asset Loader 自动处理 Reference/Import 逻辑,根据资产类型智能选择
- BR-PLUGIN-002:Smart Publish 在门禁检查失败时中止,显示详细错误列表
- BR-PLUGIN-003:插件版本与服务端版本兼容性检查,不兼容时提示升级
2.7.3 开发者生态 (API & SDK)
| API 类型 | 用途 | 目标用户 |
|---|---|---|
| Python API | DCC 内自定义工具开发 | Pipeline TD |
| REST API | Web 端集成和外部系统对接 | 开发者 |
| GraphQL API | 复杂查询和数据聚合 | 前端开发者 |
| Event Daemon | 事件监听与回调 | Pipeline TD |
| Webhook | 外部系统通知接入 | 第三方系统 |
2.7.4 API 调试控制台 (API Explorer)
功能描述: 内置于系统 Web 端的 API 调试工具,供 Pipeline TD 和开发者直接测试 API 调用,无需离开 系统使用外部工具。
| 子功能 | 描述 |
|---|---|
| REST 调试 | 类似 Postman 的 REST API 调试界面,支持所有 HTTP 方法 |
| GraphQL Playground | 交互式 GraphQL 查询编辑器,带自动补全和文档 |
| 认证集成 | 自动使用当前登录用户的 Token,无需手动配置 |
| 请求历史 | 保存最近的 API 调用记录,支持重放 |
| 代码生成 | 将调试好的请求一键生成 Python/cURL/JavaScript 代码片段 |
| 响应检查 | JSON 格式化展示 + 字段搜索 + 响应时间统计 |
2.7.5 环境管理器 (Environment Manager)
功能描述: 管理工作室内 DCC 软件版本、插件版本和 Python 包依赖,确保团队开发环境的一致性。
| 子功能 | 描述 |
|---|---|
| DCC 版本注册 | 注册工作室内可用的 DCC 版件版本(Maya 2024/2025 等) |
| 环境配置包 | 将 DCC 版本 + 插件版本 + Python 依赖打包为"环境配置" |
| 项目绑定 | 将环境配置绑定到项目(确保"此项目使用 Maya 2024 + NEXUS 插件 v2.3") |
| 版本分发 | DCC 插件版本通过系统自动分发到艺术家工作站 |
| 兼容性矩阵 | 展示各 DCC 版本与 NEXUS 插件版本的兼容性 |
| 环境诊断 | 艺术家工作站环境一键检查,发现不一致自动修复 |
业务规则:
- BR-ENV-001:DCC 启动时自动检查环境配置,不一致时提示修复
- BR-ENV-002:环境配置变更需要 TD 审批后推送
- BR-ENV-003:支持灰度发布(先推送给测试组验证,再全量推送)
2.7.6 脚本仓库 (Script Repository)
功能描述: 工作室内部工具和脚本的版本管理、文档化和分发平台,类似内部 PyPI/GitHub。
| 子功能 | 描述 |
|---|---|
| 脚本上传 | TD 上传 Python 脚本/工具包,附带版本号和变更日志 |
| 文档自动生成 | 从代码注释自动生成 API 文档 |
| 依赖管理 | 声明脚本依赖关系,自动解析 |
| 安装与更新 | 类似 pip install 的命令行安装方式 |
| 权限控制 | 按团队/项目控制脚本可见性 |
| 使用统计 | 每个脚本的安装量和使用频率统计 |
2.7.7 DCC 插件通信协议
插件与桌面应用通信架构:
DCC 进程 (Maya/Nuke/Houdini) NEXUS Desktop (Tauri)
┌─────────────────────┐ ┌──────────────────────┐
│ NEXUS Plugin │ TCP Socket │ DCC Bridge Server │
│ (PySide6 + Python) │◄─────────────►│ (Rust, port 9876) │
│ │ JSON-RPC 2.0 │ │
└─────────────────────┘ └──────────────────────┘
| 配置项 | 规范 |
|---|---|
| 通信协议 | TCP Socket + JSON-RPC 2.0 |
| 监听端口 | localhost:9876(可配置,多实例递增 9877, 9878...) |
| 连接发现 | 插件启动时扫描端口范围,或读取 ~/.nexus/bridge.lock 获取端口 |
| 心跳 | 每 10s 双向 ping,30s 无响应判定断连 |
| 重连 | 插件端自动重连,间隔 2s → 5s → 10s → 30s |
| 并发 | 支持多个 DCC 同时连接桌面应用 |
JSON-RPC 方法清单:
| 方法 | 方向 | 描述 |
|---|---|---|
task.getCurrent |
Plugin → Desktop | 获取当前分配的任务 |
task.updateStatus |
Plugin → Desktop | 更新任务状态 |
file.getInputs |
Plugin → Desktop | 获取上游输入文件列表 |
file.publish |
Plugin → Desktop | Smart Publish 触发发布流程 |
file.lock |
Plugin → Desktop | 锁定当前工作文件 |
file.download |
Plugin → Desktop | 请求下载资产到本地缓存 |
review.getAnnotations |
Plugin → Desktop | 获取审片批注 |
scene.setup |
Plugin → Desktop | 获取场景初始化配置 |
auth.getToken |
Plugin → Desktop | 获取当前有效的 API Token |
notify.taskUpdated |
Desktop → Plugin | 通知任务有更新 |
notify.fileNewVersion |
Desktop → Plugin | 通知上游文件有新版本 |
notify.reviewFeedback |
Desktop → Plugin | 通知有新的审片反馈 |
插件与后端通信路径:
DCC Plugin ──TCP──► NEXUS Desktop ──HTTPS──► API Gateway ──► Backend Services
(Token 代理)
- 所有 API 请求统一由桌面应用代理,不允许插件直连 API Gateway
- 桌面应用负责 Token 管理(刷新、缓存)和请求加密
- 优势:单点认证管理、离线队列统一处理、网络配置集中化
- 无桌面应用场景(如 render farm):插件回退到直连模式,使用 Service Account Token
Event Daemon 协议:
| 配置项 | 规范 |
|---|---|
| 协议 | NATS 轻量消息(嵌入 Rust Core)或 WebSocket |
| 事件格式 | CloudEvents v1.0 (JSON) |
核心事件类型:
| 事件 Subject | Payload | 触发场景 |
|---|---|---|
nexus.file.saved |
{scene_path, dcc_app, timestamp} |
DCC 保存文件时 |
nexus.file.opened |
{scene_path, dcc_app} |
DCC 打开文件时 |
nexus.render.started |
{scene_path, frame_range, output_path} |
发起本地渲染时 |
nexus.render.completed |
{output_path, duration, status} |
渲染完成时 |
nexus.publish.pre |
{scene_path, publish_type} |
发布前钩子 |
nexus.publish.post |
{published_file_id, version} |
发布完成后 |
nexus.scene.changed |
{scene_path, change_type} |
外部工具修改场景文件时 |
DCC 环境隔离:
| 场景 | 隔离方式 |
|---|---|
| 不同项目使用不同 DCC 版本 | 通过 Environment Manager 创建环境配置包,绑定项目 |
| Python 环境隔离 | 每个项目/DCC 版本使用独立的 Python virtualenv |
| 环境切换 | 艺术家切换项目时,桌面应用自动激活对应环境配置 |
| 插件版本 | 插件与桌面应用版本号绑定,启动时校验兼容性矩阵 |
| 配置分发 | 环境配置包通过 NEXUS CDN 分发,桌面应用自动下载和缓存 |
2.8 核心模块七:审片与反馈 (Review & Approval)
2.8.1 功能描述
支持从每日样片(Dailies)到最终客户交付的全流程审片,是质量控制的关键环节。
2.8.2 Web 端审片播放器
| 子功能 | 描述 | 技术要求 |
|---|---|---|
| 高帧率流媒体 | 浏览器内流畅播放 2K/4K 素材 | HLS/DASH 自适应码率 |
| 帧级批注 | 专业绘图工具叠加在视频上 | 画笔/箭头/几何图形/文字,支持压感 |
| 版本对比 | 分屏/叠化/差异化对比 | Split Screen / Overlay / Difference Matte |
| 播放列表 (Playlist) | 组织多个版本为审片列表 | 拖拽排序,支持分享 |
| 帧精确播放 | 逐帧前进/后退,精确到单帧 | 快捷键 J/K/L 控制 |
| 音频同步 | 支持音频轨道与画面同步 | 多轨道音频 |
| LUT/OCIO 色彩管理 | 确保审片色彩准确 | OpenColorIO 标准实现 |
交互描述:
- 左侧为播放列表面板,右侧为批注面板
- 时间轴下方显示批注标记点(点击跳转到对应帧)
- 支持 Wacom 数位板压感输入
- 批注可标记为"已解决"/"未解决"
- 快捷键:空格播放/暂停,方向键逐帧,数字键切换播放速度
业务规则:
- BR-REV-001:审片批注自动关联到对应任务的反馈记录
- BR-REV-002:版本状态变更(Approved/Retake)需要有审片权限的角色操作
- BR-REV-003:审片播放器强制开启动态水印(显示用户名/IP/时间戳)
- BR-REV-004:OCIO 配置文件由项目级别统一管理
2.8.3 Dailies 会议模式
功能描述: 专为每日审片会 (Dailies) 设计的会议工具,将审片组织、实时反馈和会后纪要自动化。
| 子功能 | 描述 | 交互方式 |
|---|---|---|
| 会议创建 | 选择日期/时间/参会人/播放列表 | 表单创建 + 日历集成 |
| 自动播放列表 | 自动收集当天所有"Pending Review"状态的版本 | 一键生成今日播放列表 |
| 会议模式播放 | 全屏播放 + 实时批注面板 | 主持人控制播放进度 |
| 实时投票 | 参会人对每个版本实时投 Approve/Retake | 快捷按钮 |
| 语音转文字 | 会议讨论实时语音转录为文字记录 | 麦克风按钮开启 |
| 会议纪要自动生成 | 会后自动汇总所有批注和投票结果 | 按镜头分类的结构化报告 |
| 纪要分发 | 将反馈自动推送到对应艺术家的任务 | 一键分发 + 自动创建返修任务 |
业务规则:
- BR-DAILY-001:会议纪要自动关联到每个审片版本和对应任务
- BR-DAILY-002:Retake 投票达到阈值(如 Supervisor 点击 Retake)时自动创建返修任务
- BR-DAILY-003:会议历史永久保存,支持按日期/项目检索
- BR-DAILY-004:支持远程参会(WebRTC 视频通话 + 同步播放)
2.8.4 LookDev 审批模式
功能描述: 针对 Look Development 的专业审批工具,支持多角度、多光照条件的资产外观审查。
| 子功能 | 描述 |
|---|---|
| 转盘展示 | 360度旋转展示(支持交互拖拽旋转或自动播放) |
| 多光照对比 | 同一资产在不同 HDRI 环境光下的并排对比 |
| 灰球/色球参考 | 自动在画面中显示灰球和色球用于色彩校准 |
| 材质细节放大 | 支持局部放大查看材质纹理细节(无损缩放) |
| 变体对比 | 同一资产不同变体(如干净版/脏旧版)并排对比 |
| 与参考图对比 | 将 LookDev 结果与创意参考图并排展示 |
业务规则:
- BR-LOOK-001:LookDev 审批需要 Supervisor 和 Director 双签
- BR-LOOK-002:LookDev 通过后自动锁定材质版本,下游(灯光/合成)引用此版本
2.8.5 跨镜头一致性对比
功能描述: 横向对比同一场景/序列下多个镜头的画面,确保灯光、色调、氛围的视觉一致性。
| 子功能 | 描述 |
|---|---|
| 多镜头并排 | 最多同时显示 6 个镜头的关键帧(同步或独立播放) |
| 序列串联播放 | 按剪辑顺序连续播放一组镜头,检查视觉连贯性 |
| 色彩分析叠加 | 在画面上叠加波形图/矢量示波器,量化色彩差异 |
| 标记不一致 | Supervisor 可标记"不一致"并批注,自动通知对应灯光师 |
2.8.6 RV/Hiero 深度集成
| 子功能 | 描述 |
|---|---|
| Playlist 同步 | Web 端播放列表一键在本地 RV 打开 |
| 流式加载 | RV 从服务器流式加载高分辨率源素材 |
| 批注同步 | RV 中的批注同步回 系统数据库 |
| OCIO 一致性 | 确保 Maya→Nuke→RV 色彩空间一致 |
2.9 核心模块八:多地协作 (Multi-site Collaboration)
2.9.1 功能描述
针对跨国/跨城市分公司协作场景,解决大文件传输慢、版本不一致的核心问题。
2.9.2 分布式缓存架构
中心-边缘拓扑:
┌─────────────────┐
│ 云端主库 │
│ (Metadata DB) │
│ (Object Store) │
└────────┬────────┘
│ 元数据实时同步
┌──────────────┼──────────────┐
│ │ │
┌────────▼───────┐ ┌───▼──────────┐ ┌▼───────────────┐
│ 上海边缘节点 │ │ 成都边缘节点 │ │ 温哥华边缘节点 │
│ (Local NAS) │ │ (Local NAS) │ │ (Local NAS) │
│ (Cache Layer) │ │ (Cache Layer)│ │ (Cache Layer) │
└────────────────┘ └──────────────┘ └────────────────┘
智能预取 (Intelligent Prefetching):
- 当总监将镜头分配给远端艺术家时,系统自动在后台将所需素材推送到对应边缘节点
- 预取基于任务依赖分析,自动计算需要哪些上游文件
- 第二天艺术家打开文件时读取本地局域网速度,完全无感
2.9.3 高速传输协议
| 特性 | 描述 |
|---|---|
| UDP 加速 | 克服 TCP 在高延迟网络下的带宽利用率低问题 |
| 断点续传 | 网络中断后自动恢复,无需重新开始 |
| 数据校验 | MD5/XXHash 确保传输完整性 |
| 带宽调度 | 支持设置传输优先级和带宽限制 |
| 压缩传输 | 文件传输前自动压缩(可配置) |
业务规则:
- BR-SYNC-001:元数据同步延迟不超过 5 秒(全球范围内)
- BR-SYNC-002:文件同步冲突时采用"最新写入优先"策略,保留冲突版本
- BR-SYNC-003:边缘节点缓存空间不足时,按 LRU 策略自动清理过期缓存
2.10 核心模块九:外包管理 (Outsourcing Management)
2.10.1 功能描述
管理将任务外包给外部供应商 (Vendor) 的完整流程,包括外包包创建、权限隔离、进度跟踪和质量验收。
2.10.2 外包全流程
| 阶段 | 功能 | 操作角色 |
|---|---|---|
| 创建外包包 | 选择待外包的任务,打包为外包工单(含需求描述、参考资料、截止日期、报价) | Coordinator / Vendor Manager |
| 供应商分配 | 从供应商库中选择 Vendor 并发送邀请 | Vendor Manager |
| 权限配置 | 自动为 Vendor 创建受限账户,仅可见外包包内的任务和文件 | 系统自动 + Admin 审核 |
| 素材下发 | 将上游素材(模型/贴图/参考等)打包推送给 Vendor | 系统自动(基于任务依赖) |
| 进度跟踪 | Vendor 提交进度更新和中间版本 | Vendor |
| 质量验收 | Supervisor 审片 + 门禁检查 → Approve 或 Retake | Supervisor / Vendor Manager |
| 交付接收 | Vendor 提交最终文件,系统自动纳入主版本库 | 系统自动 + 人工确认 |
| 费用结算 | 记录外包费用,关联到项目成本 | Producer |
业务规则:
- BR-VENDOR-001:Vendor 账户严格隔离,不可浏览项目内其他未授权资产
- BR-VENDOR-002:Vendor 不可下载源文件(如 Maya 场景),仅可通过审片播放器查看代理文件
- BR-VENDOR-003:外包文件上传自动经过门禁检查(命名规范、格式、分辨率)
- BR-VENDOR-004:外包费用自动归集到对应项目的成本中心
2.10.3 供应商库管理
| 子功能 | 描述 |
|---|---|
| 供应商档案 | 公司信息、联系人、擅长领域、历史评分 |
| 历史合作记录 | 过往外包项目的质量评分、交付及时率 |
| 供应商评分 | 基于交付质量、及时性、返修率的自动评分 |
| 合同管理 | 保密协议 (NDA)、服务协议的上传和有效期追踪 |
2.11 核心模块十:交付管理 (Delivery Management)
2.11.1 功能描述
管理 CG 制作最终交付物的全生命周期,从交付规范定义到客户验收签收。
2.11.2 交付流程
| 阶段 | 功能 | 描述 |
|---|---|---|
| 规范定义 | 交付规范模板 | 定义交付格式(DPX/EXR/ProRes)、分辨率、色彩空间、文件命名等 |
| 交付打包 | 自动打包工具 | 根据规范自动收集和转码最终版本文件 |
| 质量检查 | 交付检查清单 | 自动验证:分辨率、帧数、色彩空间、文件完整性 |
| 客户预览 | 客户门户预览 | 客户在门户中预览交付物(带水印) |
| 客户审批 | 签收确认 | 客户在门户中逐镜头确认接收 |
| 正式交付 | 文件传输 | 通过高速传输通道或物理介质交付无水印源文件 |
| 版本管理 | 交付版本历史 | 记录每次交付的版本、日期、客户反馈 |
业务规则:
- BR-DELIV-001:交付包生成前自动执行完整的交付检查清单,任何项不通过则阻止交付
- BR-DELIV-002:客户签收记录作为项目结项和收款的依据
- BR-DELIV-003:交付文件的传输全程加密,传输完成后校验哈希值
2.12 扩展能力一:移动端 NEXUS Go
2.10.1 功能描述
将导演、制片人和总监从工位解放,利用碎片化时间进行决策。根据用户角色自动切换界面模式。
2.10.2 导演/总监模式 (Review Mode)
| 子功能 | 描述 | 交互方式 |
|---|---|---|
| 每日样片流 | 类似短视频应用的沉浸式刷片体验 | 上下滑动切换版本 |
| 触控批注 | 充分利用触控特性 | 手指/Apple Pencil 直接在画面上绘制 |
| 语音+画笔 | 混合输入,语音自动转文字 | 按住麦克风按钮边说边画 |
| 离线审片 | 登机模式,有网时自动同步 | 下载播放列表 → 离线批注 → 联网同步 |
| 快速审批 | 滑动手势快速 Approve/Retake | 右滑通过,左滑返修 |
| 现场参考采集 | 在拍摄现场快速拍照/录像并上传为参考 | 相机按钮 → 拍摄 → 选择关联镜头/资产 → 上传 |
| 创意方向浏览 | 查看当前项目/序列的创意方向板 | 参考图集浏览 + 标注查看 |
2.12.3 制片人模式 (Producer Mode)
| 子功能 | 描述 | 交互方式 |
|---|---|---|
| 项目脉搏 | 实时动态流,今日完成数、即将到期里程碑 | 下拉刷新 |
| 一键审批 | 处理审批请求(加班/外包费用等) | 滑动或点击审批按钮 |
| 关键指标 | 燃尽图、资源利用率等核心数据 | 图表卡片式展示 |
| 通讯录 | 项目组通讯录 | 一键拨号/唤起微信/钉钉 |
| 推送通知 | 关键事件实时推送 | 系统级推送通知 |
业务规则:
- BR-MOBILE-001:离线数据加密存储,App 卸载时自动清除
- BR-MOBILE-002:移动端审片支持最高 1080p 预览(节省流量)
- BR-MOBILE-003:审批操作需二次确认(防止误触)
- BR-MOBILE-004:超过 30 天未使用的离线缓存自动清理
2.11 扩展能力二:AI 智能化模块
2.11.1 AI 剧本拆解 (AI Script Breakdown)
功能描述: 利用大语言模型对 PDF 剧本进行语义分析,自动识别并提取实体,将数天的手工拆解工作缩短至数十分钟。
处理流程:
上传PDF → AI解析(NER) → 实体分类 → 人工校验(高亮交互) → 一键生成资产/镜头列表
| 识别实体类型 | 示例 | 生成结果 |
|---|---|---|
| 角色 (Cast) | "Neo"、"Trinity" | Asset (Character) |
| 道具 (Prop) | "红色药丸"、"墨镜" | Asset (Prop) |
| 场景 (Set) | "INT. 地铁站 - NIGHT" | Asset (Environment) |
| 视效提示 (VFX Cues) | "爆炸"、"子弹时间" | Task (VFX) 标签 |
交互描述:
- 上传后显示进度条(解析/分类/生成三阶段)
- 校验界面:左侧原文高亮标记,右侧实体列表可编辑
- 支持人工修正 AI 的错误标记(增删改标签)
- 确认后一键在数据库中批量创建实体
业务规则:
- BR-AI-001:AI 结果必须经过人工校验才能生效,不允许全自动创建
- BR-AI-002:支持中文和英文剧本解析
- BR-AI-003:解析历史保留,支持重新解析和版本对比
2.11.2 生成式排期 (Generative Scheduling)
功能描述: 利用遗传算法解决资源冲突与排期优化的 NP-hard 难题。
输入约束:
- 硬性约束:截止日期、可用人员数量、技能匹配
- 软性约束:优先级偏好(质量优先/速度优先/成本优先)
- 历史数据:各部门/艺术家的历史完成效率
输出方案:
| 方案 | 描述 | 风险评估 |
|---|---|---|
| 激进方案 | 最早完工,需要 20% 加班 | 风险高,成本高 |
| 平衡方案 | 按时完工,资源利用率最优 | 推荐方案 |
| 保守方案 | 延期一周,无需加班 | 风险低,成本最低 |
业务规则:
- BR-SCHED-001:生成排期耗时不超过 5 分钟(1000 任务规模)
- BR-SCHED-002:排期方案可导出为甘特图视图或 PDF 报告
- BR-SCHED-003:选定方案后一键应用到任务系统
2.11.3 语义化资产搜索
功能描述: 通过 CV 视觉分析自动标签 + 自然语言检索,解决"找不到素材"的问题。
| 子功能 | 描述 |
|---|---|
| 视觉标签自动化 | Playblast/缩略图上传时 CV 模型自动打标签 |
| 自然语言检索 | 输入"下雨的城市夜景"即可匹配 |
| 相似搜索 | 上传参考图搜索相似资产 |
| 标签校正 | 人工可修正/补充 AI 标签 |
2.12 基础支撑功能
以下功能虽未在原始策划案中显式列出,但为系统正常运行和用户体验所必需:
2.12.1 用户账户与权限管理
功能描述: 管理用户身份认证和授权,支持企业级的权限控制。
| 子功能 | 描述 | 业务规则 |
|---|---|---|
| 用户注册/登录 | 支持用户名密码 + SSO 单点登录 | 密码复杂度:8位以上,含大小写+数字+特殊字符 |
| LDAP/AD 集成 | 对接企业目录服务 | 支持自动同步组织架构和用户信息 |
| 多租户架构 | 不同工作室/部门数据隔离 | 租户间数据完全隔离,不可跨租户访问 |
| 组织架构管理 | 部门、团队、项目组三级结构 | 支持矩阵式管理(用户可属于多个项目组) |
| RBAC 权限矩阵 | 基于角色的细粒度权限控制 | 预置 6 种角色模板,支持自定义角色 |
| MFA 多因素认证 | 二次验证(TOTP/短信/邮件) | 管理员账户强制开启 MFA |
| 会话管理 | 多设备登录控制 | 同时在线设备上限可配置(默认 5 台) |
| 设备管理 | 信任设备、设备注销 | 新设备首次登录需邮件验证 |
预置角色权限矩阵:
| 权限项 | Admin | IT Admin | Producer | Director | Supervisor | Coordinator | Artist | Vendor Mgr | Vendor |
|---|---|---|---|---|---|---|---|---|---|
| 项目创建/删除 | 可 | 否 | 可 | 否 | 否 | 否 | 否 | 否 | 否 |
| 任务分配 | 可 | 否 | 可 | 否 | 可 | 可 | 否 | 可(外包) | 否 |
| 审片审批 | 可 | 否 | 可 | 可 | 可 | 否 | 否 | 否 | 否 |
| 文件发布 | 可 | 否 | 可 | 否 | 可 | 可 | 可 | 可 | 可(限定) |
| 文件下载源文件 | 可 | 可 | 可 | 可 | 可 | 可 | 可 | 可 | 否 |
| 查看财务数据 | 可 | 否 | 可 | 否 | 否 | 否 | 否 | 否 | 否 |
| 系统配置 | 可 | 可 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
| API 访问 | 可 | 可 | 可 | 只读 | 可 | 可 | 可(只读) | 可(只读) | 否 |
| 外包管理 | 可 | 否 | 可 | 否 | 否 | 可 | 否 | 可 | 否 |
| 变更管理 | 可 | 否 | 可 | 否 | 可(评估) | 否 | 否 | 否 | 否 |
| 报价/竞标 | 可 | 否 | 可 | 否 | 可(工时估算) | 否 | 否 | 否 | 否 |
| 高管仪表盘 | 可 | 否 | 可 | 否 | 否 | 否 | 否 | 否 | 否 |
| 存储/网络运维 | 可 | 可 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
| 客户门户管理 | 可 | 否 | 可 | 否 | 否 | 可 | 否 | 否 | 否 |
2.12.2 系统管理后台
| 子功能 | 描述 |
|---|---|
| 全局配置面板 | 分辨率模板、帧率预设、色彩空间、命名规范 |
| License 管理 | 许可证分配、到期提醒、使用量统计 |
| 备份策略配置 | 自动备份频率、保留周期、恢复测试 |
| 系统健康监控 | CPU/内存/磁盘/网络实时指标 + 服务状态 |
| 存储管理 | 存储池配置、使用量统计、配额分配 |
| 外部集成配置 | LDAP/SMTP/Slack/钉钉等外部服务的连接配置 |
2.12.3 通知引擎(跨渠道)
| 渠道 | 适用端 | 配置项 |
|---|---|---|
| 站内通知 | Web/Desktop/Mobile | 默认开启 |
| 邮件通知 | 全端 | SMTP配置,支持模板自定义 |
| 移动端推送 | iOS/Android | APNs/FCM 集成 |
| 桌面端推送 | Windows/macOS/Linux | 系统级通知 |
| 钉钉/企业微信 | 全端 | Webhook/机器人集成 |
| Slack/Teams | 全端 | OAuth 集成 |
通知偏好设置:
- 用户可按通知类型和渠道自由组合开关
- 支持"免打扰"时段设置
- 支持每日/每周摘要汇总邮件
- 紧急通知(如系统故障)忽略免打扰设置
2.12.4 全局搜索
| 子功能 | 描述 |
|---|---|
| 跨实体搜索 | 同时搜索任务、资产、文件、聊天记录、用户 |
| 分面过滤 | 按实体类型、项目、日期、状态多维过滤 |
| 搜索历史 | 保存最近 50 条搜索记录 |
| 保存筛选器 | 保存常用搜索条件为"快捷筛选" |
| 权限过滤 | 搜索结果自动过滤无权限的实体 |
| 模糊匹配 | 支持拼写纠错和同义词匹配 |
交互描述:
- 全局快捷键
Ctrl/Cmd + K唤起搜索框 - 输入时实时显示搜索建议(防抖 300ms)
- 搜索结果分组展示(按实体类型分组,每组显示前 5 条)
- 支持键盘上下箭头导航 + Enter 进入
2.12.5 审计追踪与操作日志
| 日志类型 | 记录内容 | 保留周期 |
|---|---|---|
| 操作日志 | 所有实体的 CRUD 操作 | 3 年 |
| 访问日志 | 文件下载、审片查看 | 3 年 |
| 登录日志 | 登录/登出、设备信息、IP | 1 年 |
| 变更历史 | 字段级变更记录(旧值→新值) | 永久 |
| 审计报告 | 按 TPN 要求生成合规报告 | 永久 |
2.12.6 数据导入/导出与迁移
| 子功能 | 描述 |
|---|---|
| CSV/Excel 导入 | 批量创建任务、资产、用户 |
| 数据导出 | 报表导出为 PDF/Excel/CSV |
| ShotGrid 迁移 | 专用迁移工具,映射字段和状态 |
| ftrack 迁移 | 专用迁移工具 |
| 项目归档 | 将完结项目打包归档(元数据+文件索引) |
| 归档恢复 | 将归档项目恢复为活跃状态 |
2.12.7 国际化 (i18n) 与本地化
| 子功能 | 描述 |
|---|---|
| 多语言 | 中文简体/繁体、英文(首期),日文/韩文(后续) |
| 多时区 | 全局时区设置 + 用户个人时区偏好 |
| 多币种 | 财务模块支持 CNY/USD/EUR/GBP/JPY |
| 日期格式 | 支持 YYYY-MM-DD / MM/DD/YYYY / DD/MM/YYYY |
| 数字格式 | 千位分隔符本地化 |
2.12.8 自定义与配置化
| 子功能 | 描述 |
|---|---|
| 自定义字段 | 为任意实体添加自定义属性(文本/数字/下拉/日期/链接) |
| 自定义状态流 | 不同项目可定义不同的任务状态流转规则 |
| 自定义仪表盘 | 拖拽式仪表盘构建器,组合可用小部件 |
| 模板系统 | 项目模板/任务模板/工作流模板 |
| 品牌定制 | Logo、主题色、登录页背景(白标能力) |
2.12.9 文件预览引擎
| 文件类型 | 预览方式 | 支持格式 |
|---|---|---|
| 3D 模型 | WebGL 实时渲染 | .obj, .fbx, .glb, .gltf, .usd |
| 图片/贴图 | 浏览器内查看器 | .jpg, .png, .tiff, .exr, .hdr, .psd |
| 视频 | 流媒体播放器 | .mp4, .mov, .avi, .mxf |
| 文档 | 内嵌查看器 | .pdf, .docx |
| 场景文件 | 缩略图+元数据 | .ma, .mb, .nk, .hip |
2.12.10 客户/外部协作门户
功能描述: 面向外部客户的安全访问门户,提供审片、反馈、交付、进度查看等完整的客户侧体验。
| 子功能 | 描述 |
|---|---|
| 客户审片入口 | 无需安装软件,浏览器内审片+反馈 |
| 受限视图 | 只能看到被分享的特定播放列表/资产 |
| 安全分享链接 | 支持过期时间、访问次数限制、密码保护 |
| 外部用户管理 | 邀请外部用户,授予临时权限 |
| 反馈收集 | 客户批注自动转化为任务反馈(支持自由批注+结构化反馈表单) |
| 交付物下载 | 客户下载最终交付文件(DPX/EXR/ProRes等),带下载权限控制和审计日志 |
| 项目进度概览 | 客户可见的简化版项目进度视图:里程碑完成状态、整体完成百分比(不涉及内部细节) |
| 审批历史追踪 | 客户查看自己的反馈历史:哪些批注已被执行、哪些在处理中、哪些被标记为已解决 |
| 变更请求提交 | 客户正式提交需求变更请求(关联到具体镜头/资产),进入变更管理流程 |
| 审片会议预约 | 客户在线预约审片会议时间,与制片人日历联动 |
| 账单查看 | 查看项目合同概要、付款进度、发票状态(可选开放) |
| 多语言界面 | 客户门户独立支持多语言(中/英/日),不受内部系统语言设置影响 |
业务规则:
- BR-PORTAL-001:客户门户所有操作记录审计日志(下载、查看、反馈)
- BR-PORTAL-002:客户门户强制开启动态水印
- BR-PORTAL-003:交付物下载需要客户先完成审批签收流程
- BR-PORTAL-004:变更请求提交后 24 小时内必须有内部响应(系统自动提醒制片人)
- BR-PORTAL-005:客户预约审片会议需要制片人确认后生效
2.12.11 渲染农场集成
| 子功能 | 描述 |
|---|---|
| 调度器对接 | Deadline / Tractor / 自研调度器 |
| 作业监控 | 渲染进度、失败重试、队列状态 |
| 资源面板 | 渲染节点负载、GPU/CPU 利用率 |
| 成本追踪 | 按项目/镜头归集渲染成本(机时+电费) |
2.12.12 回收站与数据保护
| 子功能 | 描述 | 保留策略 |
|---|---|---|
| 软删除 | 所有实体删除后进入回收站 | 默认 90 天 |
| 误删恢复 | 回收站内一键恢复 | 恢复后关联关系自动重建 |
| 永久删除 | 管理员可清空回收站 | 不可逆,需二次确认 |
| 保留策略 | 按项目/实体类型配置保留周期 | 到期自动永久删除 |
2.12.13 收藏与快捷访问
| 子功能 | 描述 |
|---|---|
| 个人收藏夹 | 收藏常用项目/资产/镜头/任务 |
| 最近访问 | 显示最近 20 条访问记录 |
| 快捷入口 | 自定义侧边栏快捷入口 |
| 个人主页 | 聚合收藏、最近访问、待办事项 |
2.12.14 帮助与引导系统
| 子功能 | 描述 |
|---|---|
| 新手引导 | 首次登录的交互式引导流程 |
| 上下文帮助 | 界面元素旁的 "?" 帮助气泡 |
| 快捷键体系 | 全局快捷键 + 模块专属快捷键 |
| 知识库 | 在线文档、视频教程、FAQ |
| 变更日志 | 版本更新后弹窗展示新功能 |
2.12.15 产能规划 (Capacity Planning)
功能描述: 面向高管和制片人,对工作室未来 3-6 个月的产能进行预测和规划。
| 子功能 | 描述 |
|---|---|
| 当前负载视图 | 全工作室/各部门当前的任务负载率 |
| 未来产能预测 | 基于现有项目排期推算未来每月的产能占用 |
| 新项目模拟 | 模拟新增一个项目后对现有产能的影响("如果接这个项目会怎样?") |
| 人力缺口预警 | 识别未来某时间段可能出现的人力不足(如"3月动画部门缺2人") |
| 招聘建议 | 基于产能缺口自动生成招聘需求建议 |
| 技能分布 | 全工作室的技能分布图谱(建模X人、动画Y人...) |
业务规则:
- BR-CAP-001:产能预测算法考虑历史请假率和效率系数
- BR-CAP-002:新项目模拟不影响实际数据(虚拟推演)
- BR-CAP-003:人力缺口超过阈值时自动通知高管
2.12.16 Showreel/作品集管理
功能描述: 管理工作室对外展示的作品集和 Showreel,从已交付项目中筛选精华镜头生成展示视频。
| 子功能 | 描述 |
|---|---|
| 精选库 | 从已交付项目中标记"精选"镜头/资产 |
| Showreel 编辑 | 将精选片段按顺序编排,定义转场和配乐 |
| 版本管理 | Showreel 的版本历史 |
| 客户授权 | 记录每个镜头的对外展示授权状态(部分项目有保密协议不可公开) |
| 多格式输出 | 导出为不同格式/分辨率(网站用/演示用/社交媒体用) |
| 嵌入代码 | 生成可嵌入到公司网站的播放器代码 |
业务规则:
- BR-REEL-001:未获得客户授权的项目素材禁止加入 Showreel
- BR-REEL-002:Showreel 对外发布需要高管审批
2.12.17 技能档案与成长追踪
功能描述: 为每位艺术家维护技能档案,支持技能标签匹配和个人成长路径追踪。
| 子功能 | 描述 |
|---|---|
| 技能标签 | 为用户标记技能标签(建模、绑定、动画、灯光等)及熟练程度(初级/中级/高级/专家) |
| 技能评估 | Supervisor 定期评估并更新艺术家技能等级 |
| 成长记录 | 记录技能等级变更历史、培训参与、优秀作品 |
| 技能匹配 | 任务分配时自动推荐技能匹配的艺术家 |
| 团队技能图谱 | 团队维度的技能分布雷达图(用于识别技能短板) |
业务规则:
- BR-SKILL-001:技能评估每季度至少进行一次
- BR-SKILL-002:技能数据用于 AI 排期的人员匹配算法
2.13 跨平台功能一致性
为确保用户在不同终端间的无缝体验:
| 一致性维度 | 要求 |
|---|---|
| 数据一致性 | 所有端口共享同一后端 API,数据实时同步 |
| 状态同步 | 在 Web 端修改任务状态,移动端实时可见(延迟 < 3s) |
| 会话同步 | 用户偏好、已读状态、收藏夹跨端同步 |
| 离线同步 | 离线操作在联网后自动同步,冲突时提示用户选择 |
| 通知同步 | 一个端已读的通知在其他端同步为已读 |
3. 界面设计与用户体验
3.1 设计原则
| 原则 | 描述 |
|---|---|
| 效率优先 | CG 生产争分夺秒,减少每一次点击和等待 |
| 上下文关联 | 信息在需要时出现,减少跳转和查找 |
| 渐进式复杂度 | 默认简洁视图,高级功能按需展开 |
| 色彩中性 | 深色主题为主(保护艺术家色彩判断力),浅色主题可选 |
| 信息密度可调 | 支持紧凑/舒适/宽松三种信息密度 |
3.1.1 视觉设计系统 (Design System)
色彩体系:
| 类别 | Token 名称 | 深色模式值 | 浅色模式值 | 用途 |
|---|---|---|---|---|
| 主色 | --color-primary |
#4361EE | #3A56D4 | 主操作按钮、链接、选中态 |
| 主色悬浮 | --color-primary-hover |
#5A7BFF | #2D46B8 | 按钮悬浮态 |
| 强调色 | --color-accent |
#7209B7 | #6A00A8 | 标签、徽章、次级操作 |
| 成功 | --color-success |
#06D6A0 | #05B88A | 完成状态、通过审批 |
| 警告 | --color-warning |
#FFD166 | #E8B84A | 逾期预警、注意事项 |
| 错误 | --color-error |
#EF476F | #D63A5C | 错误提示、拒绝、删除 |
| 信息 | --color-info |
#4CC9F0 | #3ABADE | 帮助提示、通知 |
| 背景-主 | --color-bg-primary |
#1A1A2E | #FFFFFF | 页面主背景 |
| 背景-次 | --color-bg-secondary |
#16213E | #F5F5F7 | 卡片、面板背景 |
| 背景-三 | --color-bg-tertiary |
#0F3460 | #E8E8ED | 输入框、表格斑马纹 |
| 文字-主 | --color-text-primary |
#E8E8E8 | #1D1D1F | 标题、正文 |
| 文字-次 | --color-text-secondary |
#A0A0A0 | #6E6E73 | 描述、辅助信息 |
| 文字-禁用 | --color-text-disabled |
#555555 | #C7C7CC | 禁用态文字 |
| 边框 | --color-border |
#2A2A4A | #D2D2D7 | 分割线、输入框边框 |
| 边框-聚焦 | --color-border-focus |
#4361EE | #3A56D4 | 输入框聚焦边框 |
任务状态色彩映射:
| 状态 | 色彩 | Token |
|---|---|---|
| Not Started | #6C757D (灰) |
--status-not-started |
| In Progress | #4361EE (蓝) |
--status-in-progress |
| Review | #7209B7 (紫) |
--status-review |
| Approved | #06D6A0 (绿) |
--status-approved |
| Retake | #EF476F (红) |
--status-retake |
| On Hold | #FFD166 (黄) |
--status-on-hold |
| Final | #118AB2 (深蓝) |
--status-final |
字体规范:
| 级别 | 字号 | 行高 | 字重 | 用途 |
|---|---|---|---|---|
| Display | 32px | 40px | 700 | 页面大标题 |
| H1 | 24px | 32px | 600 | 章节标题 |
| H2 | 20px | 28px | 600 | 卡片标题 |
| H3 | 16px | 24px | 600 | 小节标题 |
| Body-L | 16px | 24px | 400 | 主要正文 |
| Body-M | 14px | 20px | 400 | 表格、列表、描述 |
| Body-S | 12px | 16px | 400 | 辅助信息、时间戳 |
| Caption | 11px | 14px | 400 | 标签、角标 |
| Code | 13px (monospace) | 20px | 400 | 代码片段、文件路径 |
字体栈:'Inter', 'Noto Sans SC', -apple-system, BlinkMacSystemFont, sans-serif;代码字体:'JetBrains Mono', 'Fira Code', monospace
间距系统:
基准单位:4px。所有间距使用 4 的倍数。
| Token | 值 | 用途 |
|---|---|---|
--space-1 |
4px | 图标与文字间距 |
--space-2 |
8px | 紧凑内边距、相关元素间距 |
--space-3 |
12px | 表格单元格内边距 |
--space-4 |
16px | 卡片内边距、列表项间距 |
--space-5 |
20px | 段落间距 |
--space-6 |
24px | 区块间距 |
--space-8 |
32px | 章节间距 |
--space-10 |
40px | 页面边距 |
--space-16 |
64px | 大区块分隔 |
圆角与阴影:
| Token | 值 | 用途 |
|---|---|---|
--radius-xs |
2px | 标签、徽章 |
--radius-sm |
4px | 按钮、输入框 |
--radius-md |
8px | 卡片、弹窗 |
--radius-lg |
12px | 大面板、模态框 |
--radius-full |
9999px | 头像、圆形按钮 |
--shadow-sm |
0 1px 2px rgba(0,0,0,0.2) |
下拉菜单 |
--shadow-md |
0 4px 12px rgba(0,0,0,0.25) |
卡片悬浮 |
--shadow-lg |
0 8px 24px rgba(0,0,0,0.3) |
模态框、弹层 |
动画规范:
| 场景 | 时长 | 缓动函数 | 示例 |
|---|---|---|---|
| 微交互 | 150ms | ease-out |
按钮悬浮、开关切换 |
| 展开/折叠 | 250ms | ease-in-out |
面板展开、手风琴 |
| 页面过渡 | 300ms | ease-in-out |
路由切换、模态框出入 |
| 骨架屏 | 1500ms | linear(循环) |
加载占位脉冲动画 |
| Toast 提示 | 入场 200ms / 停留 3000ms / 出场 200ms | ease-out / ease-in |
成功/错误提示 |
信息密度模式:
| 模式 | 行高倍率 | 间距倍率 | 字号调整 | 适用场景 |
|---|---|---|---|---|
| 紧凑 (Compact) | 0.85x | 0.75x | -1px | 数据密集型表格、甘特图 |
| 舒适 (Comfortable) | 1.0x | 1.0x | 0 | 默认模式 |
| 宽松 (Spacious) | 1.15x | 1.25x | +1px | 审片、创意浏览 |
3.2 PC Web 端 UI 设计
3.2.1 响应式布局
┌──────────────────────────────────────────────────────────┐
│ 顶部导航栏:Logo + 全局搜索 + 通知 + 用户菜单 │
├──────────┬───────────────────────────────┬───────────────┤
│ │ │ │
│ 左侧 │ 主内容区域 │ 右侧 │
│ 导航栏 │ │ 详情面板 │
│ │ • 甘特图/看板/表格视图 │ │
│ • 项目 │ • 审片播放器 │ • 实体详情 │
│ • 任务 │ • 文件浏览器 │ • 批注列表 │
│ • 资产 │ • BI 仪表盘 │ • 活动日志 │
│ • 审片 │ • 工作流编辑器 │ • 关联实体 │
│ • 统计 │ │ │
│ • 设置 │ │ │
│ │ │ │
├──────────┴───────────────────────────────┴───────────────┤
│ 底部状态栏:同步状态 + 存储使用量 + 系统通知 │
└──────────────────────────────────────────────────────────┘
断点适配规则:
| 断点 | 屏幕宽度 | 布局调整 |
|---|---|---|
| 桌面大屏 | ≥ 1920px | 三栏布局(导航+主区+详情) |
| 桌面标准 | 1280-1919px | 三栏布局(详情面板可折叠) |
| 平板横屏 | 1024-1279px | 两栏布局(导航折叠为图标) |
| 平板竖屏 | 768-1023px | 单栏布局(导航收起为汉堡菜单) |
浏览器兼容性:
| 浏览器 | 最低版本 | 支持级别 |
|---|---|---|
| Chrome | 90+ | 完整支持 |
| Firefox | 88+ | 完整支持 |
| Safari | 15+ | 完整支持 |
| Edge | 90+ | 完整支持 |
| IE | - | 不支持 |
3.2.2 主题系统
| 主题 | 描述 | 适用场景 |
|---|---|---|
| 深色模式(默认) | 深灰背景 + 高对比文字 | 长时间工作、色彩敏感场景 |
| 浅色模式 | 浅色背景 | 明亮办公环境 |
| 高对比模式 | 增强对比度 | 无障碍访问需求 |
3.3 PC 桌面应用端 UI 设计
3.3.1 本地 UI 特性
| 特性 | 描述 |
|---|---|
| 原生窗口管理 | 支持多窗口、窗口分屏、浮动面板 |
| 系统托盘 | 最小化到系统托盘,后台接收通知 |
| 桌面通知 | 系统级推送通知(非浏览器通知) |
| 快捷键 | 全局快捷键(如 Ctrl+Shift+N 唤起NEXUS) |
| 文件拖拽 | 从文件管理器拖拽文件到应用窗口 |
| 本地文件监控 | 监控工作目录文件变更,自动同步 |
| 右键菜单集成 | 文件右键菜单增加"在NEXUS中查看" |
3.3.2 DCC 插件面板 UI
┌──────────────────────────────┐
│ NEXUS Panel (200-400px宽) │
├──────────────────────────────┤
│ [My Tasks] [Loader] [Pub] │ ← 标签页切换
├──────────────────────────────┤
│ │
│ 当前任务:SH010_Anim_v003 │
│ 状态:In Progress │
│ 截止:2026-03-15 │
│ ──────────────────────── │
│ 📋 总监反馈: │
│ "手臂动作幅度再大一些" │
│ [查看帧级批注] │
│ ──────────────────────── │
│ 📁 输入文件: │
│ ✅ Rig_v005 (最新) │
│ ⚠️ Layout_v003 (有更新v004) │
│ [更新] [忽略] │
│ ──────────────────────── │
│ [打开工作文件] [Smart发布] │
│ │
└──────────────────────────────┘
3.3.3 Tauri 客户端技术规范
IPC 通信协议(WebView ↔ Rust 后端):
| 通信方式 | 方向 | 用途 | 序列化 |
|---|---|---|---|
invoke (Command) |
WebView → Rust | 同步请求(文件操作、数据库查询) | serde_json |
emit / listen (Event) |
双向 | 异步事件(文件变更通知、同步状态) | serde_json |
window.emit |
Rust → 指定窗口 | 窗口级事件(如详情面板更新) | serde_json |
Channel |
Rust → WebView | 流式数据(如上传进度、日志流) | serde_json |
Tauri Command 命名规范:
模块::动作::子动作
示例:
file::cache::get # 获取缓存文件
file::cache::clear # 清理缓存
sync::delta::pull # 拉取增量数据
sync::offline_queue::push # 推入离线操作队列
db::tasks::query # 查询本地任务
auth::token::refresh # 刷新本地 Token
dcc::connect::status # 查询 DCC 连接状态
进程模型:
┌─────────────────────────────────────────┐
│ NEXUS Desktop (Tauri 主进程) │
│ ┌───────────────────────────────────┐ │
│ │ Rust Core │ │
│ │ • SQLite 本地数据库 │ │
│ │ • 文件缓存管理 (LRU) │ │
│ │ • 文件监控 (notify-rs) │ │
│ │ • WebSocket 客户端 │ │
│ │ • 后台同步引擎 │ │
│ │ • DCC Bridge (localhost TCP) │ │
│ └───────────────────────────────────┘ │
│ ┌───────────────────────────────────┐ │
│ │ WebView (渲染进程) │ │
│ │ • React UI(与 Web 端共享组件库) │ │
│ │ • invoke() 调用 Rust Core │ │
│ └───────────────────────────────────┘ │
└────────────────────┬────────────────────┘
│ localhost TCP/Named Pipe
┌────────────────────▼────────────────────┐
│ DCC 插件进程 (Maya/Nuke/Houdini...) │
│ • PySide6 面板 UI │
│ • 通过 localhost:9876 与桌面应用通信 │
└─────────────────────────────────────────┘
- DCC 插件作为独立进程运行,通过 localhost TCP Socket 与桌面应用通信
- 桌面应用 Rust Core 统一管理认证 Token、缓存和网络请求
- 多窗口场景:主窗口 + 审片浮动窗口 + 设置窗口,通过 Tauri 多窗口 API 管理
本地数据库同步策略:
| 阶段 | 流程 | 说明 |
|---|---|---|
| 首次登录 | 全量拉取 | 拉取用户所属项目的任务/文件元数据,写入 SQLite |
| 正常在线 | WebSocket 推送 | 收到变更事件后,调用 /sync/delta 拉取增量写入 SQLite |
| 定时兜底 | 30s 轮询 | 防止 WS 丢消息,每 30s 调用 delta 补偿 |
| 离线恢复 | 增量同步 | 重新连网后,以 last_sync_cursor 为起点拉取全部增量 |
| 冲突处理 | 乐观锁 | 本地修改与服务端冲突时弹窗提示用户选择(保留本地/采用服务端/合并) |
SQLite Schema 版本管理:使用 Rust rusqlite 的 user_version pragma,应用启动时检查并执行迁移脚本。
文件缓存策略:
| 配置项 | 默认值 | 说明 |
|---|---|---|
| 缓存根目录 | ~/.nexus/cache/ |
可由用户在设置中修改 |
| 最大缓存空间 | 50 GB | 可配置 10-200 GB |
| 淘汰算法 | LRU(Least Recently Used) | 空间不足时自动清理最久未访问的文件 |
| 预取规则 | 打开项目 → 预取当前镜头的上游资产 | 后台线程低优先级下载 |
| 文件校验 | SHA-256 | 下载完成后校验,不一致则重新下载 |
| 清理触发 | 剩余空间 < 5GB 或缓存空间 > 上限 | 后台自动清理 + 手动清理入口 |
| 缓存锁定 | 用户可"钉住"关键资产 | 被钉住的文件不参与 LRU 淘汰 |
自动更新实现:
| 项目 | 规范 |
|---|---|
| 更新框架 | Tauri Updater v2(内置) |
| 更新检查 | 启动时 + 每 6 小时定时检查 |
| 增量更新 | 使用 bsdiff 算法计算补丁,减少下载量 |
| 签名校验 | Ed25519 签名验证更新包完整性 |
| 更新模式 | 静默下载 → 提示安装(非强制);安全更新强制安装 |
| 版本通道 | stable / beta / nightly,用户可切换 |
| 企业内网 | 支持配置私有更新服务器 URL(自建 Tauri Updater Server) |
| 回滚 | 保留上一版本安装包,更新失败自动回滚 |
崩溃收集:
| 组件 | 方案 |
|---|---|
| Rust 崩溃 | panic::set_hook 捕获 + minidump 生成,上传到 Sentry |
| WebView 崩溃 | Sentry JS SDK 自动捕获 |
| 符号表 | CI 构建时上传 .dSYM / .pdb 到 Sentry |
| 上下文附加 | 用户 ID、租户 ID、OS 版本、内存使用、最近操作 |
| 离线采集 | 崩溃日志本地持久化,下次启动时上传 |
| 用户反馈 | 崩溃后弹出反馈表单,用户可描述复现步骤 |
3.4 移动端 UI 设计
3.4.1 移动端优化原则
| 原则 | 具体措施 |
|---|---|
| 触控优化 | 所有可点击元素最小尺寸 44x44pt |
| 单手操作 | 核心操作集中在屏幕下半部分 |
| 手势支持 | 滑动审批、捏合缩放、长按菜单 |
| 离线优先 | 关键数据预加载,离线可用 |
| 网络优化 | 图片懒加载、渐进式加载、数据压缩 |
3.4.2 屏幕适配
| 设备 | 布局 | 特殊适配 |
|---|---|---|
| iPhone (≤ 6.7") | 单栏布局 | 底部 Tab 导航 |
| iPad (横屏) | 分栏布局 | 侧边栏 + 主内容 |
| iPad (竖屏) | 单栏布局 | 导航抽屉 |
| Android 手机 | 单栏布局 | Material Design 规范 |
| Android 平板 | 分栏布局 | 自适应宽度 |
| 折叠屏 | 多窗口 | 展开时分栏,折叠时单栏 |
3.4.3 移动端技术规范
Riverpod 状态管理规范:
分层架构(Clean Architecture 变体):
┌──────────────────────────────────────┐
│ UI Layer (Widgets + Controllers) │
│ • ConsumerWidget / HookConsumerWidget│
│ • 只读取 Provider,不直接操作数据 │
├──────────────────────────────────────┤
│ Application Layer (Use Cases) │
│ • StateNotifierProvider / AsyncNotifier│
│ • 业务逻辑、状态转换、离线队列协调 │
├──────────────────────────────────────┤
│ Domain Layer (Entities + Repos) │
│ • 纯 Dart 对象,无框架依赖 │
├──────────────────────────────────────┤
│ Data Layer (Repositories + Sources) │
│ • Provider 封装 Dio 网络请求 │
│ • Provider 封装 Drift/Hive 本地存储 │
│ • 离线/在线数据源自动切换 │
└──────────────────────────────────────┘
Provider 命名与生命周期:
| Provider 类型 | 命名规则 | 生命周期 | 示例 |
|---|---|---|---|
| FutureProvider | {entity}Provider |
按需创建,自动释放 | taskListProvider |
| StateNotifierProvider | {entity}NotifierProvider |
跟随页面 | taskFilterNotifierProvider |
| StreamProvider | {entity}StreamProvider |
活跃订阅期间 | notificationStreamProvider |
| Provider (常量) | {service}Provider |
全局单例 | apiClientProvider |
离线模式实现:
| 组件 | 实现 |
|---|---|
| 离线检测 | connectivity_plus + 定时 HTTP HEAD 检查 |
| 离线 Banner | 全局顶部横幅,显示"离线模式 - 操作将在联网后同步" |
| 离线队列 | 持久化到 Hive Box offline_queue |
| 队列结构 | {id: UUID, entity: String, action: String, payload: JSON, created_at: DateTime, retry_count: int, idempotency_key: String} |
| 重试策略 | 联网后按 FIFO 顺序重放,指数退避(1s → 2s → 4s),最多重试 5 次 |
| 幂等保证 | 每个操作携带 idempotency_key,服务端去重 |
| 冲突处理 | 重放失败时入 conflict_queue,下次打开 App 弹窗提示用户处理 |
| 数据可用性 | 任务列表、审片列表、通知列表均可离线浏览(Drift SQLite 缓存) |
推送技术方案:
| 配置项 | iOS | Android |
|---|---|---|
| 推送服务 | APNs | FCM |
| SDK | firebase_messaging (统一封装) |
firebase_messaging |
| Token 注册 | App 启动 → 获取 Token → POST /devices/register |
同左 |
| Token 刷新 | onTokenRefresh 回调 → PUT /devices/{id}/token |
同左 |
| 后台唤醒 | Silent Push(content-available: 1) |
Data Message(priority: high) |
推送 Payload 结构:
{
"notification": {
"title": "审片反馈",
"body": "VFX总监对 SH010_Comp_v005 添加了批注"
},
"data": {
"type": "review.commented",
"entity_type": "review_session",
"entity_id": "uuid-xxx",
"project_id": "uuid-yyy",
"deep_link": "nexus://projects/uuid-yyy/review/uuid-xxx"
}
}
推送分类与用户偏好:
| 推送类别 | 默认状态 | 用户可配置 |
|---|---|---|
| 任务分配 | 开启 | 是 |
| 审片反馈 | 开启 | 是 |
| 审批请求 | 开启(不可关闭) | 否 |
| 聊天消息 | 开启 | 是(可按频道配置免打扰) |
| 系统通知 | 开启(不可关闭) | 否 |
| 每日汇总 | 关闭 | 是 |
安全存储实现:
| 存储项 | 方案 | 说明 |
|---|---|---|
| Access Token | flutter_secure_storage (Keychain / EncryptedSP) | 内存中优先使用,fallback 安全存储 |
| Refresh Token | flutter_secure_storage | 仅存安全存储,不暴露给 Dart 层 |
| 用户生物信息 | local_auth (Face ID / Fingerprint) | 应用解锁、敏感操作二次确认 |
| 离线数据加密 | SQLCipher (Drift 加密扩展) | 数据库文件 AES-256 加密 |
| 加密密钥 | 硬件安全模块 (Secure Enclave / StrongBox) | 密钥不出安全硬件 |
后台任务:
| 任务 | Android | iOS | 触发条件 |
|---|---|---|---|
| 离线队列同步 | WorkManager (PeriodicWork) | BGAppRefreshTask | 网络可用 + 队列非空 |
| 审片视频预下载 | WorkManager (OneTimeWork) | BGProcessingTask | WiFi + 充电中 |
| 通知 Token 刷新 | WorkManager (PeriodicWork) | 自动 (APNs) | 每 24h |
| 缓存清理 | WorkManager (PeriodicWork) | BGProcessingTask | 低电量 / 存储 < 1GB |
约束条件:所有后台任务遵循 NetworkType.CONNECTED(同步类)或 NetworkType.UNMETERED(下载类) + BatteryNotLow。
深度链接 (Deep Link):
| 平台 | 方案 | 配置 |
|---|---|---|
| iOS | Universal Links | apple-app-site-association 配置 nexus-x.com 域名 |
| Android | App Links | assetlinks.json 配置 nexus-x.com 域名 |
| 自定义 Scheme | nexus:// |
兜底方案,App 未安装时跳转应用商店 |
深度链接路由映射:
| URL 路径 | App 页面 | 来源 |
|---|---|---|
nexus://projects/{id}/tasks/{taskId} |
任务详情页 | 推送通知、邮件 |
nexus://projects/{id}/review/{sessionId} |
审片播放器 | 推送通知 |
nexus://projects/{id}/files/{fileId} |
文件详情页 | 聊天链接 |
nexus://chat/{roomId} |
聊天会话 | 推送通知 |
nexus://notifications |
通知中心 | 推送汇总 |
应用体积与启动优化:
| 优化项 | 策略 | 目标 |
|---|---|---|
| 安装包体积 | Tree Shaking + 按功能模块拆分(Deferred Components) | iOS < 50MB, Android < 40MB |
| 首屏启动 | 冷启动:Native Splash → Flutter Engine → 首帧 | ≤ 2s |
| 初始化分级 | P0:认证 + 路由 → P1:推送 + 网络 → P2:缓存 + 分析 | P0 < 500ms |
| 图片优化 | 按设备 DPR 请求合适尺寸、WebP 格式、内存缓存 + 磁盘缓存 | - |
| 延迟加载 | BI 图表、3D 预览等重度功能首次进入时加载 | - |
3.5 平台特定设计
3.5.1 移动端特有设计
| 特性 | 描述 |
|---|---|
| 手势操作 | 右滑=Approve, 左滑=Retake, 下拉=刷新, 长按=多选 |
| 生物识别 | Face ID / Touch ID / 指纹解锁 |
| 离线模式 | 审片列表下载、离线批注、联网后同步 |
| 低电量优化 | 低电量模式下降低刷新频率、关闭动画 |
| 横竖屏 | 审片模式自动横屏,管理模式竖屏 |
3.5.2 PC 桌面端特有设计
| 特性 | 描述 |
|---|---|
| 本地存储 | VFS 映射的本地文件缓存 |
| 后台同步 | 系统托盘常驻,后台同步文件 |
| 多显示器 | 支持跨显示器拖拽窗口 |
| 性能模式 | 高性能模式(更高刷新率、更多动画) |
| 本地渲染预览 | 利用本地 GPU 加速 3D 预览 |
3.6 前端工程规范
3.6.1 组件规范
目录结构(Atomic Design 分层):
src/
├── components/
│ ├── atoms/ # 最小粒度组件(Button, Input, Icon, Badge)
│ ├── molecules/ # 原子组合体(SearchBar, FileCard, UserAvatar)
│ ├── organisms/ # 完整功能区块(GanttChart, ReviewPlayer, TaskBoard)
│ ├── templates/ # 页面骨架布局(ThreeColumnLayout, FullScreenLayout)
│ └── pages/ # 路由级页面组件(ProjectDashboard, ShotDetail)
├── hooks/ # 自定义 Hooks(useWebSocket, useOfflineQueue)
├── stores/ # Zustand stores
├── services/ # API 请求封装
├── utils/ # 工具函数
├── styles/ # 全局样式、Design Tokens
├── i18n/ # 国际化资源
└── routes/ # 路由配置
命名约定:
| 类型 | 命名规则 | 示例 |
|---|---|---|
| 组件文件 | PascalCase | TaskCard.tsx |
| Hook 文件 | camelCase, use 前缀 | useTaskList.ts |
| Store 文件 | camelCase, Store 后缀 | projectStore.ts |
| 工具函数 | camelCase | formatDuration.ts |
| 常量文件 | UPPER_SNAKE_CASE 导出 | export const MAX_UPLOAD_SIZE = ... |
| CSS Modules | camelCase | taskCard.module.css |
组件设计规则:
- 所有对外组件必须定义 TypeScript Props Interface,标注
required/optional - 复杂组件须提供
Storybook Story,覆盖默认态、加载态、空态、错误态 - 无障碍(a11y):交互元素须有
aria-label,键盘可操作(Tab/Enter/Escape) - 组件导出使用
index.tsbarrel file
3.6.2 状态管理规范
状态分层:
| 状态类型 | 管理方式 | 示例 |
|---|---|---|
| 服务端状态 | React Query (TanStack Query) | 任务列表、项目数据、审片记录 |
| 客户端全局状态 | Zustand | 当前用户、主题偏好、侧边栏展开 |
| 客户端局部状态 | React useState/useReducer | 表单输入、弹窗开关、临时筛选 |
| URL 状态 | React Router searchParams | 分页、排序、筛选条件 |
| 实时状态 | WebSocket + Zustand | 在线用户、实时通知、任务状态变更 |
Zustand Store 拆分原则:
- 按业务域拆分:
authStore,projectStore,taskStore,reviewStore,chatStore,uiStore - 单个 Store 不超过 15 个状态字段,超过则拆分子 Store
- 避免 Store 间循环依赖,如需跨 Store 读取使用
subscribe或事件总线
React Query 规范:
- 查询 Key 统一格式:
[domain, action, params],如['tasks', 'list', { projectId, status }] - 列表接口默认
staleTime: 30s,详情接口staleTime: 60s - 写操作使用
useMutation+ 乐观更新(Optimistic Update),失败自动回滚 - 缓存失效策略:写操作成功后调用
queryClient.invalidateQueries定向刷新
3.6.3 路由设计
核心路由表:
| 路径 | 页面 | 权限 | 懒加载 |
|---|---|---|---|
/login |
登录页 | 公开 | 否 |
/projects |
项目列表 | 已登录 | 是 |
/projects/:id/dashboard |
项目仪表盘 | 项目成员 | 是 |
/projects/:id/tasks |
任务管理 | 项目成员 | 是 |
/projects/:id/shots |
镜头网格 | 项目成员 | 是 |
/projects/:id/files |
文件浏览器 | 项目成员 | 是 |
/projects/:id/review |
审片系统 | 项目成员 | 是 |
/projects/:id/review/:sessionId |
审片播放器 | 受邀成员 | 是 |
/projects/:id/workflow |
工作流编辑器 | Coordinator+ | 是 |
/projects/:id/bi |
BI 仪表盘 | Producer+ | 是 |
/projects/:id/outsource |
外包管理 | Coordinator+ | 是 |
/projects/:id/delivery |
交付管理 | Coordinator+ | 是 |
/admin/users |
用户管理 | Admin | 是 |
/admin/system |
系统设置 | Admin | 是 |
/me/performance |
个人效能 | 已登录 | 是 |
/portal/:token |
客户门户 | Token 验证 | 是 |
/* |
404 页面 | 公开 | 否 |
路由守卫层级:
AuthGuard(登录检查)
└── TenantGuard(租户校验)
└── ProjectGuard(项目成员校验)
└── RoleGuard(角色权限校验)
└── FeatureGuard(功能开关校验)
面包屑规则: 根据路由层级自动生成,支持项目名/实体名动态替换。如:首页 > 项目A > 任务管理 > SH010_Anim
3.6.4 国际化技术方案
| 配置项 | 规范 |
|---|---|
| 库选型 | i18next + react-i18next |
| Key 命名 | 命名空间:模块.组件.描述,如 task:board.column.inProgress |
| 语言包加载 | 按命名空间懒加载,首屏仅加载 common + 当前路由命名空间 |
| 复数处理 | 使用 i18next 内置复数规则(_one, _other) |
| 日期格式 | 统一使用 date-fns + locale,禁止硬编码日期格式 |
| 数字格式 | 使用 Intl.NumberFormat 处理千分位、货币符号 |
| 时区 | 所有时间存储为 UTC,展示时按用户时区转换 |
| 后端文案 | API 返回的错误消息和枚举值由前端映射为本地化文案 |
3.6.5 主题机制
Design Token 体系:
/* tokens.css - CSS 自定义属性 */
:root[data-theme="dark"] {
--color-bg-primary: #1a1a2e;
--color-bg-secondary: #16213e;
--color-bg-tertiary: #0f3460;
--color-text-primary: #e8e8e8;
--color-text-secondary: #a0a0a0;
--color-accent: #4361ee;
--color-success: #06d6a0;
--color-warning: #ffd166;
--color-error: #ef476f;
--spacing-unit: 4px;
--radius-sm: 4px;
--radius-md: 8px;
--shadow-sm: 0 1px 2px rgba(0,0,0,0.3);
/* ... */
}
切换与持久化:
- 通过
useTheme()Hook 获取/切换主题 - 主题偏好写入
localStorage+ 同步到用户服务端配置 <html data-theme="dark">属性驱动 CSS 变量切换- 品牌定制:租户可配置 Logo URL、主色
--color-accent、登录页背景
3.6.6 WebSocket 前端策略
| 策略项 | 规范 |
|---|---|
| 连接管理 | 全局单例 Socket.IO 连接,useWebSocket() Hook 管理生命周期 |
| 自动重连 | 指数退避(1s → 2s → 4s → 8s → 16s → max 30s),最大重试 ∞ |
| 心跳 | 25s 间隔 ping,35s 无响应断开重连 |
| 认证 | 连接时携带 JWT,Token 刷新后重建连接 |
| 事件订阅 | 进入项目页自动订阅 project:{id} 频道,离开时取消订阅 |
| 状态合并 | WS 事件触发 React Query invalidateQueries,由 Query 管理缓存一致性 |
| 降级策略 | WebSocket 连接失败 3 次后降级为 30s 轮询,恢复后自动切回 WS |
| 离线缓冲 | 断线期间事件缓存在 IndexedDB,重连后回放 |
核心事件映射表:
| 事件 | 频道 | 触发行为 |
|---|---|---|
task.updated |
project:{id} |
刷新任务列表/甘特图 |
file.published |
project:{id} |
刷新文件列表,Toast 通知 |
review.commented |
review:{sessionId} |
刷新批注列表 |
chat.message |
chat:{roomId} |
追加消息 + 未读计数 |
notification.new |
user:{id} |
更新通知铃铛计数 |
user.presence |
project:{id} |
更新在线用户头像列表 |
3.6.7 大数据渲染策略
| 场景 | 策略 | 阈值 |
|---|---|---|
| 任务列表/表格 | AG Grid 虚拟滚动 | > 100 行启用 |
| 甘特图 | 仅渲染可视区域 ± 200px 缓冲区 | > 200 任务启用 |
| 镜头网格 | 虚拟化网格 + 图片懒加载(IntersectionObserver) | > 50 项启用 |
| 文件树 | 按需展开子节点,展开时请求 API | 始终 |
| 聊天记录 | 反向虚拟滚动 + 分页加载(每次 50 条) | 始终 |
| BI 图表 | 后端预聚合,前端仅渲染摘要数据 | 始终 |
加载状态规范:
- 首屏:骨架屏(Skeleton)
- 分页/懒加载:底部 Spinner
- 操作反馈:按钮 Loading 状态 + 禁用防重复点击
- 空状态:业务相关的空状态插画 + 引导文案
3.6.8 错误处理
ErrorBoundary 层级:
App ErrorBoundary(全局兜底,显示"出错了"+ 刷新按钮)
└── Layout ErrorBoundary(侧边栏/顶栏独立,主区域出错不影响导航)
└── Page ErrorBoundary(页面级,显示页面级错误提示)
└── Widget ErrorBoundary(仪表盘卡片级,单卡片出错不影响其他)
HTTP 错误统一处理:
| 状态码 | 前端行为 |
|---|---|
| 401 | 静默刷新 Token,失败则跳转登录页 |
| 403 | Toast 提示"权限不足",停留当前页 |
| 404 | 显示 404 页面或 Toast 提示 |
| 409 | 冲突对话框(如文件已被他人锁定) |
| 422 | 表单字段级错误高亮 |
| 429 | Toast 提示"操作过于频繁"+ 自动重试(Retry-After) |
| 500/503 | Toast 提示"服务暂时不可用"+ 自动重试(指数退避,最多 3 次) |
错误上报(Sentry 集成):
- 自动捕获未处理异常(React ErrorBoundary +
window.onerror) - 附加上下文:用户 ID、租户 ID、当前路由、最近操作
- 采样率:生产环境 10%(错误 100%)、预发布 100%
- Source Map 上传到 Sentry,生产环境不暴露
3.6.9 表单规范
| 规范项 | 说明 |
|---|---|
| 校验库 | Zod(Schema 定义) + React Hook Form(表单绑定) |
| 校验时机 | onBlur 实时校验 + onSubmit 全量校验 |
| 错误展示 | 字段下方红色文案 + 输入框红色边框,顶部汇总错误数 |
| 防重复提交 | 提交按钮 loading + disabled,API 层 debounce 300ms |
| 幂等保证 | 写操作请求携带 X-Idempotency-Key(UUID v4) |
| 自动保存 | 复杂表单(如工作流编辑器)500ms 防抖自动保存草稿到 localStorage |
| 富文本 | 批注描述、聊天消息使用 Tiptap 编辑器,支持 @ 提及、Markdown |
3.6.10 请求层封装
Axios 拦截器链:
请求拦截器:
1. 注入 Authorization: Bearer {accessToken}
2. 注入 X-Tenant-ID
3. 注入 X-Request-ID (UUID v4)
4. 注入 X-Idempotency-Key (仅 POST/PUT/PATCH)
响应拦截器:
1. 401 → 使用 refreshToken 刷新(加锁防并发)→ 重放请求
2. 429 → 读取 Retry-After → 自动重试
3. 5xx → 指数退避重试(最多 3 次)
4. 网络错误 → 检测在线状态 → 离线则入队列
双 Token 机制:
| Token | 有效期 | 存储 | 用途 |
|---|---|---|---|
| Access Token | 15 分钟 | 内存(Zustand) | API 请求认证 |
| Refresh Token | 7 天 | HttpOnly Cookie | 刷新 Access Token |
3.6.11 前端测试规范
| 测试类型 | 工具 | 覆盖目标 | 执行时机 |
|---|---|---|---|
| 单元测试 | Vitest | 工具函数、Hooks、Store | 每次提交(pre-commit) |
| 组件测试 | React Testing Library | 交互行为、渲染正确性 | 每次 PR |
| E2E 测试 | Playwright | 核心业务流程(10 条 Happy Path) | 每日/发版前 |
| 视觉回归 | Chromatic (Storybook) | 组件视觉一致性 | 每次 PR |
| 性能测试 | Lighthouse CI | FCP/TTI/LCP | 每次发版前 |
覆盖率要求: 单元测试 ≥ 80%,组件测试 ≥ 60%,E2E 覆盖核心流程 100%
3.6.12 代码规范
| 规范项 | 配置 |
|---|---|
| Linter | ESLint(@typescript-eslint + eslint-plugin-react-hooks) |
| Formatter | Prettier(printWidth: 100, singleQuote: true, semi: true) |
| Git Hooks | Husky + lint-staged(提交前自动 lint + format) |
| Commit 规范 | Conventional Commits:type(scope): description |
| Commit 类型 | feat / fix / refactor / perf / test / docs / chore / ci |
| 分支命名 | feature/NEXUS-123-add-gantt-view、fix/NEXUS-456-upload-crash |
| Code Review | 至少 1 人 Approve,覆盖:逻辑正确性、性能、a11y、i18n |
4. 数据库设计
4.1 数据模型总览
系统采用混合数据存储策略,不同类型的数据使用最适合的存储引擎:
| 数据类型 | 存储引擎 | 用途 |
|---|---|---|
| 结构化业务数据 | PostgreSQL | 项目/任务/资产/用户等核心实体 |
| 自定义字段 | PostgreSQL (JSONB) | 用户定义的扩展属性 |
| 缓存与会话 | Redis | 热数据缓存、用户会话、分布式锁 |
| 全文搜索索引 | Elasticsearch | 跨实体搜索 |
| 向量嵌入 | Milvus | 语义搜索(AI模块) |
| 文件对象 | MinIO / S3 / OSS | 媒体文件、渲染输出 |
| 时序指标 | InfluxDB | 系统监控、渲染统计 |
| 消息队列 | Kafka | 事件流、通知队列 |
4.2 核心数据表设计
4.2.1 组织与用户
-- 租户表
CREATE TABLE tenants (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255) NOT NULL,
slug VARCHAR(100) UNIQUE NOT NULL,
logo_url TEXT,
settings JSONB DEFAULT '{}', -- 全局配置
license_type VARCHAR(50), -- 许可类型
license_expires TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 用户表
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL REFERENCES tenants(id),
username VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL,
password_hash VARCHAR(255), -- SSO用户可为空
display_name VARCHAR(255),
avatar_url TEXT,
department_id UUID REFERENCES departments(id),
role_id UUID NOT NULL REFERENCES roles(id),
timezone VARCHAR(50) DEFAULT 'Asia/Shanghai',
locale VARCHAR(10) DEFAULT 'zh-CN',
status VARCHAR(20) DEFAULT 'active', -- active/inactive/suspended
last_login_at TIMESTAMPTZ,
mfa_enabled BOOLEAN DEFAULT FALSE,
custom_fields JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(tenant_id, username),
UNIQUE(tenant_id, email)
);
-- 部门表
CREATE TABLE departments (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL REFERENCES tenants(id),
name VARCHAR(255) NOT NULL,
parent_id UUID REFERENCES departments(id), -- 树形结构
manager_id UUID REFERENCES users(id),
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 角色表
CREATE TABLE roles (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL REFERENCES tenants(id),
name VARCHAR(100) NOT NULL,
description TEXT,
permissions JSONB NOT NULL, -- 权限清单
is_system BOOLEAN DEFAULT FALSE, -- 系统预置角色不可删除
created_at TIMESTAMPTZ DEFAULT NOW()
);
4.2.2 项目与实体
-- 项目表
CREATE TABLE projects (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL REFERENCES tenants(id),
name VARCHAR(255) NOT NULL,
code VARCHAR(50) NOT NULL, -- 项目短代码
status VARCHAR(30) DEFAULT 'active',
resolution VARCHAR(20), -- 如 "3840x2160"
fps DECIMAL(5,2), -- 帧率
color_space VARCHAR(50), -- 如 "ACEScg"
start_date DATE,
end_date DATE,
budget DECIMAL(15,2),
currency VARCHAR(3) DEFAULT 'CNY',
naming_schema JSONB, -- 命名规范配置
directory_template JSONB, -- 目录结构模板
workflow_id UUID REFERENCES workflows(id),
custom_fields JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(tenant_id, code)
);
-- 序列/场次表
CREATE TABLE sequences (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
name VARCHAR(255) NOT NULL,
code VARCHAR(50) NOT NULL,
sort_order INTEGER DEFAULT 0,
description TEXT,
custom_fields JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 镜头表
CREATE TABLE shots (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
sequence_id UUID REFERENCES sequences(id),
name VARCHAR(255) NOT NULL,
code VARCHAR(50) NOT NULL,
status VARCHAR(30) DEFAULT 'active',
frame_start INTEGER,
frame_end INTEGER,
handle_start INTEGER DEFAULT 0, -- 头部余量帧
handle_end INTEGER DEFAULT 0, -- 尾部余量帧
thumbnail_url TEXT,
description TEXT,
cut_order INTEGER, -- 剪辑顺序
custom_fields JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 资产表
CREATE TABLE assets (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
name VARCHAR(255) NOT NULL,
code VARCHAR(50) NOT NULL,
asset_type VARCHAR(50) NOT NULL, -- character/prop/environment/fx
status VARCHAR(30) DEFAULT 'active',
thumbnail_url TEXT,
description TEXT,
tags TEXT[], -- 标签数组
ai_tags JSONB DEFAULT '{}', -- AI自动打的标签+置信度
custom_fields JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 资产变体表
CREATE TABLE asset_variants (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
asset_id UUID NOT NULL REFERENCES assets(id) ON DELETE CASCADE,
name VARCHAR(255) NOT NULL, -- 如"破损版"、"雨天版"
description TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 资产-镜头关联表 (多对多)
CREATE TABLE shot_assets (
shot_id UUID NOT NULL REFERENCES shots(id) ON DELETE CASCADE,
asset_id UUID NOT NULL REFERENCES assets(id) ON DELETE CASCADE,
variant_id UUID REFERENCES asset_variants(id),
PRIMARY KEY (shot_id, asset_id)
);
4.2.3 任务与排期
-- 任务表
CREATE TABLE tasks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id),
entity_type VARCHAR(20) NOT NULL, -- 'shot' 或 'asset'
entity_id UUID NOT NULL, -- 关联的shot_id或asset_id
name VARCHAR(255) NOT NULL,
department VARCHAR(50), -- 部门/环节:modeling/rigging/animation等
status VARCHAR(30) DEFAULT 'waiting',
priority VARCHAR(10) DEFAULT 'normal', -- low/normal/high/urgent
assignee_id UUID REFERENCES users(id),
reviewer_id UUID REFERENCES users(id), -- 审核人
estimated_hours DECIMAL(8,2), -- 预估工时
actual_hours DECIMAL(8,2) DEFAULT 0, -- 实际工时
bid_days DECIMAL(8,2), -- 报价天数
start_date DATE,
due_date DATE,
completed_at TIMESTAMPTZ,
sort_order INTEGER DEFAULT 0,
is_locked BOOLEAN DEFAULT FALSE, -- Final后锁定
custom_fields JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_tasks_project ON tasks(project_id);
CREATE INDEX idx_tasks_assignee ON tasks(assignee_id);
CREATE INDEX idx_tasks_entity ON tasks(entity_type, entity_id);
CREATE INDEX idx_tasks_status ON tasks(status);
CREATE INDEX idx_tasks_due_date ON tasks(due_date);
-- 任务依赖关系表
CREATE TABLE task_dependencies (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
predecessor_id UUID NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
successor_id UUID NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
dependency_type VARCHAR(5) DEFAULT 'FS', -- FS/SS/FF/SF
lag_hours DECIMAL(8,2) DEFAULT 0, -- 滞后时间
lag_percentage DECIMAL(5,2), -- 百分比滞后(如完成80%开始)
UNIQUE(predecessor_id, successor_id)
);
-- 排期基线快照
CREATE TABLE schedule_baselines (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id),
name VARCHAR(255),
snapshot_data JSONB NOT NULL, -- 任务排期快照
created_by UUID REFERENCES users(id),
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 工时记录表
CREATE TABLE timesheets (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id),
task_id UUID NOT NULL REFERENCES tasks(id),
date DATE NOT NULL,
hours DECIMAL(4,2) NOT NULL,
description TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(user_id, task_id, date)
);
4.2.4 文件与版本
-- 发布文件表(已通过审核的版本)
CREATE TABLE published_files (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id),
task_id UUID REFERENCES tasks(id),
name VARCHAR(500) NOT NULL,
file_type VARCHAR(50), -- maya_scene/nuke_script/image/cache等
version_number INTEGER NOT NULL,
file_path TEXT NOT NULL, -- 逻辑路径
file_size BIGINT, -- 字节
checksum VARCHAR(128), -- MD5/XXHash
thumbnail_url TEXT,
metadata JSONB DEFAULT '{}', -- 帧范围、分辨率等元数据
published_by UUID REFERENCES users(id),
description TEXT,
storage_tier VARCHAR(20) DEFAULT 'hot', -- hot/warm/cold
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_published_files_task ON published_files(task_id);
CREATE INDEX idx_published_files_version ON published_files(task_id, version_number);
-- 文件依赖关系表
CREATE TABLE file_dependencies (
file_id UUID NOT NULL REFERENCES published_files(id),
depends_on_id UUID NOT NULL REFERENCES published_files(id),
dependency_type VARCHAR(30), -- reference/import/cache/plate
PRIMARY KEY (file_id, depends_on_id)
);
-- 文件锁定表
CREATE TABLE file_locks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
file_path TEXT NOT NULL UNIQUE, -- 被锁定的文件逻辑路径
locked_by UUID NOT NULL REFERENCES users(id),
locked_at TIMESTAMPTZ DEFAULT NOW(),
host_name VARCHAR(255), -- 锁定发起的主机
expires_at TIMESTAMPTZ -- 自动过期时间
);
-- 存储配置表
CREATE TABLE storage_mounts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL REFERENCES tenants(id),
name VARCHAR(255) NOT NULL,
mount_type VARCHAR(20), -- local/s3/oss/nfs
config JSONB NOT NULL, -- 连接配置(加密存储)
path_mappings JSONB NOT NULL, -- 逻辑路径到物理路径的映射
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMPTZ DEFAULT NOW()
);
4.2.5 审片与批注
-- 审片版本表
CREATE TABLE review_versions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
published_file_id UUID REFERENCES published_files(id),
task_id UUID REFERENCES tasks(id),
name VARCHAR(255),
media_url TEXT NOT NULL, -- 流媒体播放地址
proxy_url TEXT, -- 代理文件地址
thumbnail_url TEXT,
duration_frames INTEGER,
resolution VARCHAR(20),
color_space VARCHAR(50),
status VARCHAR(30) DEFAULT 'pending', -- pending/approved/retake
reviewed_by UUID REFERENCES users(id),
reviewed_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 批注表
CREATE TABLE annotations (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
review_version_id UUID NOT NULL REFERENCES review_versions(id),
author_id UUID NOT NULL REFERENCES users(id),
frame_number INTEGER, -- 批注所在帧
frame_end INTEGER, -- 批注结束帧(范围批注)
annotation_type VARCHAR(20), -- drawing/text/voice
drawing_data JSONB, -- 绘图数据(SVG/Canvas序列化)
text_content TEXT, -- 文字内容
voice_url TEXT, -- 语音批注URL
voice_transcript TEXT, -- 语音转文字
is_resolved BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 播放列表表
CREATE TABLE playlists (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id),
name VARCHAR(255) NOT NULL,
description TEXT,
created_by UUID REFERENCES users(id),
share_token VARCHAR(100) UNIQUE, -- 外部分享令牌
share_expires TIMESTAMPTZ,
share_password VARCHAR(255),
is_public BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 播放列表项
CREATE TABLE playlist_items (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
playlist_id UUID NOT NULL REFERENCES playlists(id) ON DELETE CASCADE,
review_version_id UUID NOT NULL REFERENCES review_versions(id),
sort_order INTEGER DEFAULT 0,
notes TEXT
);
4.2.6 通讯与通知
-- 聊天频道表
CREATE TABLE chat_channels (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
entity_type VARCHAR(30), -- project/sequence/shot/asset/task
entity_id UUID, -- 关联实体ID
name VARCHAR(255),
channel_type VARCHAR(20) DEFAULT 'entity', -- entity/direct/group
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 聊天消息表
CREATE TABLE chat_messages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
channel_id UUID NOT NULL REFERENCES chat_channels(id),
author_id UUID NOT NULL REFERENCES users(id),
content TEXT NOT NULL,
content_type VARCHAR(20) DEFAULT 'text', -- text/file/system
reply_to_id UUID REFERENCES chat_messages(id),
attachments JSONB DEFAULT '[]',
mentions UUID[], -- 被@的用户ID列表
entity_refs JSONB DEFAULT '[]', -- 引用的实体(#深度链接)
is_pinned BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_messages_channel ON chat_messages(channel_id, created_at);
-- 通知表
CREATE TABLE notifications (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id),
type VARCHAR(50) NOT NULL, -- mention/approval/status_change/system
title VARCHAR(500),
content TEXT,
entity_type VARCHAR(30),
entity_id UUID,
is_read BOOLEAN DEFAULT FALSE,
channels_sent TEXT[], -- 已发送的通知渠道
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_notifications_user ON notifications(user_id, is_read, created_at);
4.2.7 工作流与自动化
-- 工作流模板表
CREATE TABLE workflows (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL REFERENCES tenants(id),
name VARCHAR(255) NOT NULL,
description TEXT,
version INTEGER DEFAULT 1,
graph_data JSONB NOT NULL, -- DAG节点和连线数据
status_config JSONB, -- 各环节的状态流配置
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 门禁规则表
CREATE TABLE quality_gates (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
workflow_id UUID NOT NULL REFERENCES workflows(id),
source_step VARCHAR(100), -- 源节点
target_step VARCHAR(100), -- 目标节点
gate_type VARCHAR(50), -- script/naming/geometry/resolution
config JSONB NOT NULL, -- 检查脚本/规则配置
is_blocking BOOLEAN DEFAULT TRUE, -- 阻止型 or 警告型
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 事件触发器表
CREATE TABLE event_triggers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL REFERENCES tenants(id),
name VARCHAR(255) NOT NULL,
event_type VARCHAR(100) NOT NULL, -- task.status_changed / file.published 等
conditions JSONB NOT NULL, -- 触发条件
actions JSONB NOT NULL, -- 执行动作列表
is_active BOOLEAN DEFAULT TRUE,
retry_policy JSONB DEFAULT '{"max_retries": 3, "backoff": [30, 60, 120]}',
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 触发器执行日志
CREATE TABLE trigger_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
trigger_id UUID NOT NULL REFERENCES event_triggers(id),
event_data JSONB,
status VARCHAR(20), -- success/failed/retrying
error_message TEXT,
execution_time INTEGER, -- 毫秒
executed_at TIMESTAMPTZ DEFAULT NOW()
);
4.2.8 审计与日志
-- 审计日志表(追加写入,不可修改)
CREATE TABLE audit_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
user_id UUID,
action VARCHAR(50) NOT NULL, -- create/update/delete/read/login
entity_type VARCHAR(50),
entity_id UUID,
old_values JSONB, -- 修改前的值
new_values JSONB, -- 修改后的值
ip_address INET,
user_agent TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_audit_tenant_time ON audit_logs(tenant_id, created_at);
CREATE INDEX idx_audit_entity ON audit_logs(entity_type, entity_id);
CREATE INDEX idx_audit_user ON audit_logs(user_id, created_at);
-- 分区策略:按月分区
-- CREATE TABLE audit_logs_2026_01 PARTITION OF audit_logs
-- FOR VALUES FROM ('2026-01-01') TO ('2026-02-01');
4.2.9 新增实体:外包、交付、报价、变更、风险、参考
-- 外包包表
CREATE TABLE outsource_packages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id),
name VARCHAR(255) NOT NULL,
description TEXT,
vendor_id UUID REFERENCES users(id), -- 指派的供应商
status VARCHAR(30) DEFAULT 'draft', -- draft/sent/in_progress/review/completed
budget DECIMAL(15,2),
currency VARCHAR(3) DEFAULT 'CNY',
due_date DATE,
nda_signed BOOLEAN DEFAULT FALSE,
created_by UUID REFERENCES users(id),
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 外包包-任务关联表
CREATE TABLE outsource_package_tasks (
package_id UUID NOT NULL REFERENCES outsource_packages(id) ON DELETE CASCADE,
task_id UUID NOT NULL REFERENCES tasks(id),
PRIMARY KEY (package_id, task_id)
);
-- 供应商档案表
CREATE TABLE vendors (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL REFERENCES tenants(id),
company_name VARCHAR(255) NOT NULL,
contact_name VARCHAR(255),
contact_email VARCHAR(255),
specialties TEXT[], -- 擅长领域标签
quality_score DECIMAL(3,2), -- 综合评分(0-5)
delivery_rate DECIMAL(5,2), -- 按时交付率(%)
nda_expires DATE,
notes TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 交付包表
CREATE TABLE deliveries (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id),
name VARCHAR(255) NOT NULL,
version INTEGER DEFAULT 1,
delivery_spec JSONB NOT NULL, -- 交付规范(格式/分辨率/色彩空间等)
status VARCHAR(30) DEFAULT 'preparing', -- preparing/checking/ready/sent/accepted
checklist JSONB DEFAULT '[]', -- 交付检查清单结果
client_signed BOOLEAN DEFAULT FALSE,
client_signed_at TIMESTAMPTZ,
delivered_at TIMESTAMPTZ,
created_by UUID REFERENCES users(id),
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 交付包-文件关联表
CREATE TABLE delivery_files (
delivery_id UUID NOT NULL REFERENCES deliveries(id) ON DELETE CASCADE,
published_file_id UUID NOT NULL REFERENCES published_files(id),
transcoded_url TEXT, -- 转码后的交付文件路径
PRIMARY KEY (delivery_id, published_file_id)
);
-- 报价单表
CREATE TABLE bids (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id),
version INTEGER DEFAULT 1,
status VARCHAR(30) DEFAULT 'draft', -- draft/submitted/approved/rejected
total_amount DECIMAL(15,2),
currency VARCHAR(3) DEFAULT 'CNY',
line_items JSONB NOT NULL, -- 报价明细(按镜头/资产/部门)
notes TEXT,
created_by UUID REFERENCES users(id),
approved_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 变更请求表
CREATE TABLE change_orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id),
title VARCHAR(500) NOT NULL,
description TEXT,
requested_by UUID REFERENCES users(id), -- 可以是客户或内部人员
status VARCHAR(30) DEFAULT 'submitted', -- submitted/evaluating/approved/rejected/completed
impact_assessment TEXT, -- 影响评估
additional_cost DECIMAL(15,2),
additional_days INTEGER,
affected_entities JSONB DEFAULT '[]', -- 关联的镜头/资产/任务
approved_by UUID REFERENCES users(id),
approved_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 风险登记表
CREATE TABLE risk_registers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id),
title VARCHAR(500) NOT NULL,
description TEXT,
category VARCHAR(30), -- schedule/budget/personnel/technical/external
impact VARCHAR(10), -- low/medium/high/critical
probability VARCHAR(10), -- low/medium/high
risk_score INTEGER, -- 自动计算
mitigation TEXT, -- 应对措施
owner_id UUID REFERENCES users(id), -- 负责人
status VARCHAR(20) DEFAULT 'open', -- open/monitoring/mitigated/closed
related_entities JSONB DEFAULT '[]',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 参考资料板表
CREATE TABLE reference_boards (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id),
entity_type VARCHAR(30), -- project/sequence/asset/shot
entity_id UUID,
name VARCHAR(255) NOT NULL,
board_type VARCHAR(30) DEFAULT 'reference', -- reference/creative_brief
description TEXT,
visibility VARCHAR(20) DEFAULT 'team', -- personal/team/public
version INTEGER DEFAULT 1,
created_by UUID REFERENCES users(id),
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 参考资料项表
CREATE TABLE reference_items (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
board_id UUID NOT NULL REFERENCES reference_boards(id) ON DELETE CASCADE,
item_type VARCHAR(20), -- image/video/url/file
title VARCHAR(255),
file_url TEXT,
thumbnail_url TEXT,
source_url TEXT, -- 原始网址(如有)
annotations JSONB DEFAULT '[]', -- 标注数据
sort_order INTEGER DEFAULT 0,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 客户沟通记录表
CREATE TABLE client_communications (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id),
type VARCHAR(30), -- meeting/email/call/decision
title VARCHAR(500),
content TEXT,
participants UUID[], -- 参与者ID列表
decisions JSONB DEFAULT '[]', -- 关键决策列表
related_entities JSONB DEFAULT '[]', -- 关联实体
recorded_by UUID REFERENCES users(id),
meeting_date TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Dailies会议表
CREATE TABLE dailies_meetings (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id),
playlist_id UUID REFERENCES playlists(id),
title VARCHAR(255),
scheduled_at TIMESTAMPTZ NOT NULL,
attendees UUID[],
status VARCHAR(20) DEFAULT 'scheduled', -- scheduled/in_progress/completed
meeting_notes TEXT, -- 自动生成的会议纪要
completed_at TIMESTAMPTZ,
created_by UUID REFERENCES users(id),
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 技能标签表
CREATE TABLE user_skills (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id),
skill_name VARCHAR(100) NOT NULL, -- modeling/rigging/animation等
proficiency VARCHAR(20) DEFAULT 'intermediate', -- junior/intermediate/senior/expert
evaluated_by UUID REFERENCES users(id),
evaluated_at TIMESTAMPTZ,
notes TEXT,
UNIQUE(user_id, skill_name)
);
-- 个人工作笔记表
CREATE TABLE work_notes (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id),
task_id UUID REFERENCES tasks(id),
project_id UUID REFERENCES projects(id),
content TEXT NOT NULL,
is_private BOOLEAN DEFAULT TRUE,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_work_notes_user ON work_notes(user_id, created_at);
-- 结构化反馈表
CREATE TABLE structured_feedback (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
review_version_id UUID NOT NULL REFERENCES review_versions(id),
author_id UUID NOT NULL REFERENCES users(id),
template_id UUID, -- 反馈模板ID
responses JSONB NOT NULL, -- {"animation_pace": "too_fast", "color": "too_warm", ...}
frame_start INTEGER,
frame_end INTEGER,
overall_verdict VARCHAR(30), -- approve/minor_fix/retake/redo
priority VARCHAR(20), -- must_fix/should_fix/nice_to_have
created_at TIMESTAMPTZ DEFAULT NOW()
);
4.3 数据关系图
tenants ──1:N──> users
tenants ──1:N──> projects
tenants ──1:N──> roles
tenants ──1:N──> departments
tenants ──1:N──> vendors
projects ──1:N──> sequences ──1:N──> shots
projects ──1:N──> assets ──1:N──> asset_variants
shots ──M:N──> assets (via shot_assets)
projects ──1:N──> tasks
tasks ──M:N──> tasks (via task_dependencies)
tasks ──1:N──> published_files ──M:N──> published_files (via file_dependencies)
tasks ──1:N──> review_versions ──1:N──> annotations
tasks ──1:N──> review_versions ──1:N──> structured_feedback
tasks ──1:N──> timesheets
chat_channels ──1:N──> chat_messages
users ──1:N──> notifications
users ──1:N──> user_skills
users ──1:N──> work_notes
projects ──1:N──> playlists ──1:N──> playlist_items
workflows ──1:N──> quality_gates
tenants ──1:N──> event_triggers ──1:N──> trigger_logs
projects ──1:N──> outsource_packages ──M:N──> tasks
projects ──1:N──> deliveries ──M:N──> published_files
projects ──1:N──> bids
projects ──1:N──> change_orders
projects ──1:N──> risk_registers
projects ──1:N──> reference_boards ──1:N──> reference_items
projects ──1:N──> client_communications
projects ──1:N──> dailies_meetings
4.4 索引设计策略
| 索引类型 | 应用场景 | 示例 |
|---|---|---|
| B-tree | 等值查询、范围查询 | tasks.due_date, audit_logs.created_at |
| GIN | JSONB 字段查询 | custom_fields, permissions |
| GiST | 全文搜索 | chat_messages.content (tsvector) |
| Hash | 高频等值查询 | file_locks.file_path |
| 复合索引 | 多条件联合查询 | (project_id, status, assignee_id) |
4.5 离线存储方案
PC 桌面端
| 数据类型 | 存储方式 | 同步策略 |
|---|---|---|
| 任务列表 | SQLite 本地数据库 | 增量同步(每 30s 轮询或 WebSocket 推送) |
| 文件缓存 | 本地文件系统 | LRU 缓存,空间上限可配置 |
| 用户偏好 | 配置文件 | 启动时同步 |
移动端
| 数据类型 | 存储方式 | 同步策略 |
|---|---|---|
| 审片视频 | 设备存储(加密) | 手动下载,联网后同步批注 |
| 任务快照 | SQLite | 增量同步 |
| 通知缓存 | SQLite | 推送 + 定时拉取 |
| 离线批注 | 本地 JSON | 联网后自动上传 |
4.6 数据同步一致性
- 乐观锁:所有实体包含
updated_at字段,更新时检查时间戳防止覆盖 - 冲突解决:Last Write Wins(最后写入优先) + 冲突版本保留
- 最终一致性:跨区域数据同步采用最终一致性模型,元数据同步延迟 ≤ 5 秒
- 事务保证:单个业务操作内的多表写入通过数据库事务保证 ACID
4.6.1 增量同步接口 (/sync/delta) 完整规范
请求规范:
GET /api/v1/sync/delta?since={cursor}&entity_types=tasks,files,reviews&limit=500
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
since |
String | 是 | 上次同步游标(首次传 "0") |
entity_types |
String | 否 | 逗号分隔的实体类型过滤(默认全部) |
limit |
Integer | 否 | 每次返回最大变更数(默认 500,最大 1000) |
project_id |
UUID | 否 | 按项目过滤(移动端建议指定) |
响应格式:
{
"changes": [
{
"entity_type": "task",
"entity_id": "uuid-xxx",
"action": "updated",
"data": {
"id": "uuid-xxx",
"name": "SH010_Anim",
"status": "review",
"updated_at": "2026-02-10T08:30:00Z"
},
"version": 1707550200000
},
{
"entity_type": "file",
"entity_id": "uuid-yyy",
"action": "created",
"data": { "..." : "..." },
"version": 1707550205000
},
{
"entity_type": "task",
"entity_id": "uuid-zzz",
"action": "deleted",
"data": null,
"version": 1707550210000
}
],
"cursor": "1707550210000",
"has_more": false
}
| 字段 | 描述 |
|---|---|
changes[].action |
created / updated / deleted |
changes[].version |
单调递增的版本号(毫秒时间戳),用于排序和去重 |
cursor |
新游标,客户端下次请求传入 since |
has_more |
true 表示还有更多变更,客户端应立即发起下一次请求 |
参与同步的实体类型:
| 实体类型 | 同步范围 | 说明 |
|---|---|---|
task |
用户可见的所有任务 | 按项目权限过滤 |
file |
用户可见的文件元数据 | 不含文件内容 |
review |
用户参与的审片会话和批注 | 含批注内容 |
notification |
用户的通知 | 仅限当前用户 |
project |
用户所属项目配置 | 项目名/状态/成员变更 |
comment |
任务评论 | 按任务关联 |
4.6.2 WebSocket 与增量同步配合
协作流程图:
正常在线模式:
WebSocket 连接 ──► 收到变更事件 ──► invalidate 本地缓存 ──► UI 自动刷新
│
└──► (可选) 调用 delta API 获取完整数据
WS 断连恢复模式:
WS 断开 ──► 标记断连时间 ──► WS 重连成功 ──► 用断连前 cursor 调用 delta
──► 获取断连期间所有变更 ──► 合并到本地 ──► 恢复正常 WS 模式
长时间离线模式(桌面/移动端):
离线 ──► 本地操作入离线队列 ──► 联网 ──► 先上传离线队列(按序)
──► 再调用 delta 补偿缺失数据 ──► 冲突检测 ──► 恢复正常
WS 事件与 Delta 的分工:
| 场景 | WS 事件 | Delta API |
|---|---|---|
| 在线实时更新 | 推送轻量事件(type + entity_id) | 客户端按需拉取完整数据 |
| WS 断连 < 5 分钟 | 重连后服务端补发缓冲事件 | 不需要 |
| WS 断连 > 5 分钟 | 缓冲区溢出,发送 sync.required 事件 |
客户端必须调用 delta 全量补偿 |
| 完全离线 | 不可用 | 联网后调用 delta 拉取全部增量 |
4.6.3 离线操作队列
队列数据结构:
{
"id": "uuid-local-001",
"entity_type": "task",
"entity_id": "uuid-xxx",
"action": "update",
"payload": {
"status": "review",
"note": "动画完成,提交审片"
},
"idempotency_key": "uuid-idem-001",
"created_at": "2026-02-10T08:30:00Z",
"retry_count": 0,
"max_retries": 5,
"last_error": null
}
持久化方式:
| 平台 | 存储 |
|---|---|
| Web | IndexedDB(nexus_offline_queue store) |
| 桌面端 | SQLite(offline_queue 表) |
| 移动端 | Hive Box(offline_queue) |
重放规则:
| 规则 | 描述 |
|---|---|
| 顺序 | 严格 FIFO(按 created_at 排序),保证因果顺序 |
| 幂等 | 每个操作携带 idempotency_key,服务端自动去重 |
| 重试 | 失败后指数退避(1s → 2s → 4s → 8s → 16s),最多 5 次 |
| 合并 | 对同一实体的多次更新可合并为最后一次(可选优化) |
| 失败处理 | 超过最大重试 → 移入 conflict_queue → 下次打开 App 提示用户 |
| 网络检测 | 只在网络可用时启动重放,检测到断网立即暂停 |
4.6.4 冲突解决用户流程
冲突检测时机:
- 离线操作重放时:服务端返回 HTTP 409 (Conflict)
- 实时在线时:乐观锁
updated_at不匹配
冲突类型与处理:
| 冲突类型 | 自动处理 | 人工干预 |
|---|---|---|
| 不同字段修改 | 自动合并(字段级 merge) | 否 |
| 同一字段修改 | Last Write Wins(默认) | 可选弹窗 |
| 实体已删除 | 丢弃离线修改 | Toast 通知用户 |
| 状态流转冲突 | 拒绝本地操作 | 弹窗提示当前状态已变更 |
人工干预 UI(当自动合并失败时):
┌───────────────────────────────────────────┐
│ 冲突检测 │
│ │
│ 任务 SH010_Anim 在您离线期间被修改: │
│ │
│ ┌──────────────┬──────────────┐ │
│ │ 您的修改 │ 服务端版本 │ │
│ ├──────────────┼──────────────┤ │
│ │ 状态: Review │ 状态: Retake │ │
│ │ 备注: 完成 │ 备注: 需修改 │ │
│ └──────────────┴──────────────┘ │
│ │
│ [采用我的修改] [采用服务端] [手动合并] │
└───────────────────────────────────────────┘
4.6.5 各端同步差异
| 维度 | Web 端 | 桌面端 | 移动端 |
|---|---|---|---|
| 默认模式 | 在线优先 | 混合模式 | 离线优先 |
| 离线队列 | IndexedDB(有限) | SQLite(大容量) | Hive(加密) |
| 文件同步 | 不缓存文件内容 | LRU 文件缓存(50GB) | 仅缓存审片视频 |
| 带宽优化 | 无特殊处理 | 大文件分片传输 | 图片压缩 + 仅 WiFi 下载 |
| 同步频率 | 实时(WS 优先) | 实时 + 30s 兜底 | 前台实时,后台 15min |
| 首次同步 | 不需要(在线获取) | 全量拉取(可能 5-10min) | 按项目增量拉取 |
| 同步范围 | 当前页面数据 | 全部已分配项目 | 仅关注的项目 |
4.7 数据库工程规范
4.7.1 分库分表策略
当前阶段(Phase 1-2):单库 + 逻辑隔离
- 所有租户共享同一 PostgreSQL 集群
- 通过
tenant_id字段实现行级隔离(Row-Level Security) - RLS Policy 强制所有查询自动附加
WHERE tenant_id = current_setting('app.tenant_id')
演进计划(Phase 3+,数据量超过阈值时):
| 表 | 分表阈值 | 分表策略 | 分片键 |
|---|---|---|---|
audit_logs |
1 亿行 | 按月分区(已实现 audit_logs_YYYY_MM) |
created_at |
chat_messages |
1 亿行 | 按 tenant_id + 月份 Range 分区 |
tenant_id, created_at |
notifications |
5000 万行 | 按 tenant_id + 月份 Range 分区 |
tenant_id, created_at |
trigger_logs |
5000 万行 | 按月份 Range 分区 | created_at |
published_files |
5000 万行 | 按 tenant_id Hash 分区 |
tenant_id |
分片中间件: Citus(PostgreSQL 原生分布式扩展),渐进式引入,无需更改应用代码。
4.7.2 读写分离
部署拓扑:
写请求 ──────► PostgreSQL Primary (主库)
│
│ Streaming Replication (异步)
▼
读请求 ──────► PostgreSQL Replica 1 (只读副本)
读请求 ──────► PostgreSQL Replica 2 (只读副本)
BI 查询 ─────► PostgreSQL Replica 3 (BI 专用副本)
路由规则:
| 操作类型 | 路由 | 说明 |
|---|---|---|
| INSERT/UPDATE/DELETE | 主库 | 所有写操作 |
| SELECT(普通查询) | 只读副本 | 默认路由 |
| SELECT(强一致读) | 主库 | 写后立即读、金额/权限相关 |
| BI/报表查询 | BI 专用副本 | 重查询隔离,不影响在线业务 |
主从延迟监控:
- 监控指标:
pg_stat_replication.replay_lag - 延迟阈值:WARN > 1s,CRITICAL > 5s
- 自动切主:使用 Patroni 管理,主库故障 30s 内自动 Failover
4.7.3 连接池管理
| 配置项 | 规范 |
|---|---|
| 连接池中间件 | PgBouncer(Transaction Mode) |
| 每服务连接数 | 默认 20,高频服务(Task/File)50 |
| PgBouncer 总连接上限 | 300(对应 PostgreSQL max_connections = 350) |
| 连接超时 | 获取连接超时 5s,查询超时 30s |
| 空闲回收 | 空闲连接 300s 后回收 |
| 连接泄漏检测 | 连接持有超过 60s 输出 WARN 日志 |
| 监控 | Prometheus exporter 采集连接数、等待数、活跃查询数 |
4.7.4 Migration 流程
工具选型:
| 服务语言 | 工具 | 迁移文件格式 |
|---|---|---|
| Go | golang-migrate | {version}_{description}.up.sql / .down.sql |
| Python | Alembic | Python 迁移脚本 |
迁移原则:
| 原则 | 描述 |
|---|---|
| 只加不删 | 新增列/表不删除旧列/表,至少保留 2 个版本 |
| 先加后迁 | 先添加新列(nullable/有默认值)→ 部署新代码 → 迁移数据 → 清理旧列 |
| 向后兼容 | 当前版本代码必须兼容迁移前后两种 Schema |
| 大表安全 | 超过 100 万行的表使用 CREATE INDEX CONCURRENTLY,DDL 使用 pg_repack |
| 不可逆操作 | 数据删除/列删除需手动审批,CI 自动阻止 |
CI/CD 中的执行流程:
1. PR 提交迁移文件 → CI 在测试库执行 up + down 验证
2. 合并到 main → Staging 环境自动执行迁移
3. 生产发布 → pre-deploy Job 执行迁移(锁超时 5s,超时自动回滚)
4. 回滚 → 执行 down 迁移(如果有)或手动修复
4.7.5 查询规范
| 规范 | 描述 |
|---|---|
| 慢查询阈值 | 100ms → WARN 日志,1s → ERROR 日志 + 告警 |
| 禁止 SELECT * | 所有查询必须明确列出字段 |
| 禁止 N+1 | 使用 JOIN / 子查询 / 批量 IN 查询替代循环查询 |
| JSONB 查询 | 高频 JSONB 字段查询需建立 GIN 索引 |
| 批量写入 | 超过 100 条使用 COPY 或 unnest() 替代逐条 INSERT |
| 分页 | 深分页(offset > 10000)使用 Cursor 分页替代 OFFSET |
| 锁控制 | 避免长事务(> 10s),使用 SKIP LOCKED 处理并发任务抢占 |
| 查询计划 | 关键查询必须附 EXPLAIN ANALYZE 输出,确保使用索引 |
4.7.6 数据归档
| 表 | 归档条件 | 归档目标 | 调度 |
|---|---|---|---|
chat_messages |
创建超过 6 个月 | chat_messages_archive(分区表) |
pg_cron 每周日 02:00 |
notifications |
已读且创建超过 3 个月 | notifications_archive |
pg_cron 每周日 03:00 |
trigger_logs |
创建超过 1 个月 | trigger_logs_archive |
pg_cron 每周日 04:00 |
audit_logs |
创建超过 1 年 | 冷存储(S3 Parquet 格式) | pg_cron 每月 1 日 |
归档策略:
- 归档前自动创建临时备份
- 归档操作使用批量 DELETE + INSERT(每批 10,000 条,避免长锁)
- 归档表保留相同索引,支持历史查询
- 冷存储数据通过 AWS Athena / Trino 查询
4.7.7 多租户隔离
| 方案 | 系统选型 | 说明 |
|---|---|---|
| 独立数据库 | 企业私有化部署 | 物理隔离,最高安全级别 |
| Schema 隔离 | 不采用 | 管理复杂,迁移困难 |
| Row-Level Security | SaaS 模式(默认) | 共享表 + tenant_id + RLS Policy |
RLS Policy 实现:
-- 启用 RLS
ALTER TABLE tasks ENABLE ROW LEVEL SECURITY;
-- 创建 Policy:只能访问本租户数据
CREATE POLICY tenant_isolation ON tasks
USING (tenant_id = current_setting('app.tenant_id')::UUID);
-- 应用连接时设置租户上下文
SET app.tenant_id = 'tenant-uuid-here';
安全审计:
- 每次查询自动附加
tenant_id过滤(通过 RLS 强制,无法绕过) - 跨租户查询仅限超级管理员,需审计日志记录
- 定期扫描 SQL 日志,检测是否有绕过 RLS 的尝试
4.7.8 表结构补充规范
统一软删除:
所有业务表添加 deleted_at TIMESTAMPTZ NULL 字段,NULL 表示未删除。查询时通过视图或 RLS 自动过滤已删除记录。
字段约束补充:
| 字段类型 | 约束规范 |
|---|---|
| VARCHAR 名称类字段 | 长度 1-255,CHECK (char_length(name) > 0) |
| VARCHAR 描述类字段 | 长度 0-10000 |
| status 字段 | VARCHAR(50) CHECK (status IN ('active', 'inactive', ...)) |
| email 字段 | VARCHAR(320) CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$') |
| URL 字段 | VARCHAR(2048) |
| JSONB 字段 | DEFAULT '{}'::JSONB,搜索字段建 GIN 索引 |
索引策略补充:
| 表 | 补充索引 | 用途 |
|---|---|---|
users |
(tenant_id, email) UNIQUE, (tenant_id, username) |
用户查找 |
projects |
(tenant_id, status), (tenant_id, name) |
项目列表筛选 |
organizations |
(slug) UNIQUE |
组织标识 |
tasks |
(tenant_id, assignee_id, status) |
我的任务列表 |
published_files |
(tenant_id, entity_type, entity_id) |
实体关联文件 |
多态关联规范:
使用 entity_type + entity_id 的多态关联时:
- entity_type 使用 VARCHAR(50) + CHECK 约束(枚举值列表)
- 建立联合索引 (entity_type, entity_id)
- 不建立外键约束(多态无法引用单一表),通过应用层保证引用完整性
- 删除关联实体时通过事件驱动清理关联记录
5. API 设计
5.1 API 总体规范
5.1.1 API 风格
系统提供两种 API 风格:
| API 类型 | 用途 | 协议 |
|---|---|---|
| REST API | 标准 CRUD 操作、外部系统集成 | HTTPS + JSON |
| GraphQL API | 复杂查询、数据聚合、前端灵活获取 | HTTPS + JSON |
| gRPC | 内部微服务通信 | HTTP/2 + Protobuf |
| WebSocket | 实时推送(聊天、通知、状态变更) | WSS |
5.1.2 基础规范
Base URL:
生产环境: https://api.nexus-x.com/v1
测试环境: https://api-staging.nexus-x.com/v1
请求头:
Authorization: Bearer <access_token>
Content-Type: application/json
Accept: application/json
X-Tenant-ID: <tenant_uuid>
X-Request-ID: <unique_request_id>
Accept-Language: zh-CN
响应格式:
{
"code": 200,
"message": "success",
"data": { ... },
"meta": {
"page": 1,
"per_page": 50,
"total": 1234,
"total_pages": 25
},
"request_id": "req_abc123"
}
分页规范:
GET /api/v1/tasks?page=1&per_page=50&sort=-created_at&filter[status]=in_progress
5.1.3 幂等性设计
| 配置项 | 规范 |
|---|---|
| Header | X-Idempotency-Key: {UUID v4} |
| 适用方法 | POST / PUT / PATCH(DELETE 天然幂等) |
| 服务端去重 | Redis 存储 Key → Response 映射,TTL 24h |
| 冲突处理 | 相同 Key 重复请求返回首次响应(HTTP 200),不重复执行 |
| 客户端职责 | 前端/移动端生成 UUID v4 作为 Key,重试时复用相同 Key |
5.1.4 限流策略
| 层级 | 限制 | 实现 |
|---|---|---|
| 全局 | 10,000 RPS | Kong Rate Limiting Plugin |
| 租户级 | 1,000 RPS | 按 X-Tenant-ID 限流 |
| 用户级 | 100 RPS | 按 Authorization 中的 user_id 限流 |
| 敏感接口 | 登录 10 次/分钟,文件上传 20 次/分钟 | 独立限流规则 |
超限响应:
{
"error": {
"code": "RATE_001",
"message": "Rate limit exceeded",
"retry_after": 30
}
}
响应头:Retry-After: 30、X-RateLimit-Limit: 100、X-RateLimit-Remaining: 0、X-RateLimit-Reset: 1707580800
5.1.5 批量操作规范
| 配置项 | 规范 |
|---|---|
| 最大条目数 | 单次批量操作最多 100 条 |
| 请求格式 | POST /api/v1/tasks/batch + {"operations": [...]} |
| 执行模式 | 默认非事务(部分成功),可选 "atomic": true(全部成功或全部失败) |
| 部分失败格式 | HTTP 207 Multi-Status |
批量操作响应示例:
{
"results": [
{"index": 0, "status": 200, "data": {"id": "uuid-1", "status": "updated"}},
{"index": 1, "status": 422, "error": {"code": "RES_003", "message": "Invalid status"}},
{"index": 2, "status": 200, "data": {"id": "uuid-3", "status": "updated"}}
],
"summary": {"total": 3, "succeeded": 2, "failed": 1}
}
5.1.6 GraphQL 规范
| 配置项 | 规范 |
|---|---|
| Endpoint | POST /api/v1/graphql |
| Schema 管理 | SDL-first,存放 nexus-proto 仓库,CI 自动生成类型 |
| 变更流程 | Schema 变更须 PR 审核 + 自动兼容性检查 |
| Deprecation | 标记 @deprecated(reason: "...") → 至少保留 2 个 Minor 版本 |
| N+1 防护 | 所有关联查询使用 DataLoader 批量加载 |
| 查询限制 | 最大深度 10 层,最大复杂度 500 |
| 分页 | 使用 Relay-style Cursor Pagination(first, after, last, before) |
| 实时订阅 | GraphQL Subscriptions over WebSocket(审片批注、任务状态) |
5.1.7 API 文档规范
| 文档类型 | 工具 | 发布方式 |
|---|---|---|
| REST API | OpenAPI 3.1 (Swagger) | CI 自动生成 → 部署到 /api/docs |
| GraphQL | GraphQL SDL + GraphiQL | 内置 GraphiQL Playground /api/v1/graphql/playground |
| gRPC | Protobuf + buf.build | 内部文档站点 |
| WebSocket | AsyncAPI 2.0 | 部署到文档站点 |
| SDK 文档 | TypeDoc (TS) / pydoc (Python) | npm / PyPI 包内嵌 |
5.2 认证与授权
5.2.1 认证方式
| 方式 | 用途 | Token有效期 |
|---|---|---|
| OAuth 2.0 + PKCE | Web端/移动端用户认证 | Access: 1h, Refresh: 30d |
| API Key | 服务端集成、脚本调用 | 手动设置,可设过期时间 |
| SSO (SAML/OIDC) | 企业SSO集成 | 跟随SSO提供方 |
| Personal Access Token | Pipeline TD 开发 | 手动设置 |
5.2.2 授权模型
请求 → API网关 → 身份验证 → 租户隔离检查 → RBAC权限检查 → 业务逻辑
- 所有API调用必须携带有效的认证凭证
- 跨租户请求直接拒绝(HTTP 403)
- RBAC 权限细粒度控制到实体级别
5.3 核心接口列表
5.3.1 项目管理
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| GET | /projects | 获取项目列表 | 所有已授权用户 |
| POST | /projects | 创建项目 | Admin, Producer |
| GET | /projects/:id | 获取项目详情 | 项目成员 |
| PUT | /projects/:id | 更新项目信息 | Admin, Producer |
| DELETE | /projects/:id | 删除项目(软删除) | Admin |
| GET | /projects/:id/sequences | 获取场次列表 | 项目成员 |
| GET | /projects/:id/shots | 获取镜头列表 | 项目成员 |
| GET | /projects/:id/assets | 获取资产列表 | 项目成员 |
| GET | /projects/:id/stats | 获取项目统计数据 | Producer+ |
5.3.2 任务管理
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| GET | /tasks | 获取任务列表(支持过滤/排序) | 已授权用户 |
| POST | /tasks | 创建任务 | Coordinator+ |
| POST | /tasks/batch | 批量创建任务 | Coordinator+ |
| GET | /tasks/:id | 获取任务详情 | 任务相关人员 |
| PUT | /tasks/:id | 更新任务 | 任务相关人员 |
| PATCH | /tasks/:id/status | 更新任务状态 | 任务指派人/审核人 |
| POST | /tasks/:id/dependencies | 添加依赖关系 | Coordinator+ |
| GET | /tasks/:id/timeline | 获取甘特图数据 | 项目成员 |
| POST | /tasks/:id/timesheet | 提交工时 | 任务指派人 |
5.3.3 文件管理
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| GET | /files | 获取文件列表 | 已授权用户 |
| POST | /files/publish | 发布文件新版本 | Artist+ |
| GET | /files/:id | 获取文件详情 | 项目成员 |
| GET | /files/:id/versions | 获取版本历史 | 项目成员 |
| GET | /files/:id/dependencies | 获取依赖关系图 | 项目成员 |
| POST | /files/:id/lock | 锁定文件 | 项目成员 |
| DELETE | /files/:id/lock | 释放锁定 | 锁定者/Admin |
| POST | /files/upload | 上传文件(分片上传) | Artist+ |
| GET | /files/:id/download | 下载文件 | 项目成员(Vendor除外) |
5.3.4 审片与批注
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| GET | /reviews | 获取待审列表 | Supervisor+ |
| POST | /reviews | 创建审片版本 | Artist+ |
| PATCH | /reviews/:id/status | 审批(Approve/Retake) | Supervisor+ |
| GET | /reviews/:id/annotations | 获取批注列表 | 项目成员 |
| POST | /reviews/:id/annotations | 添加批注 | 项目成员 |
| PATCH | /annotations/:id/resolve | 标记批注已解决 | 批注相关人 |
| GET | /playlists | 获取播放列表 | 项目成员 |
| POST | /playlists | 创建播放列表 | Coordinator+ |
| POST | /playlists/:id/share | 生成分享链接 | Coordinator+ |
5.3.5 通讯
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| GET | /channels | 获取频道列表 | 已授权用户 |
| GET | /channels/:id/messages | 获取消息历史 | 频道成员 |
| POST | /channels/:id/messages | 发送消息 | 频道成员 |
| WS | /ws/chat | 实时聊天连接 | 已授权用户 |
| GET | /notifications | 获取通知列表 | 已授权用户 |
| PATCH | /notifications/read | 批量标记已读 | 已授权用户 |
| WS | /ws/notifications | 实时通知推送 | 已授权用户 |
5.3.6 AI 模块
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| POST | /ai/script-breakdown | 上传剧本进行拆解 | Producer+ |
| GET | /ai/script-breakdown/:id | 获取拆解结果 | Producer+ |
| POST | /ai/script-breakdown/:id/confirm | 确认并生成实体 | Producer+ |
| POST | /ai/schedule/generate | 生成排期方案 | Producer+ |
| POST | /ai/schedule/:id/apply | 应用排期方案 | Producer+ |
| POST | /ai/search/semantic | 语义化搜索 | 已授权用户 |
5.3.7 外包管理
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| GET | /outsource-packages | 获取外包包列表 | Coordinator+ / Vendor Manager |
| POST | /outsource-packages | 创建外包包 | Coordinator+ / Vendor Manager |
| GET | /outsource-packages/:id | 获取外包包详情 | 包关联人员 |
| PUT | /outsource-packages/:id | 更新外包包 | Coordinator+ / Vendor Manager |
| POST | /outsource-packages/:id/assign | 分配给供应商 | Vendor Manager |
| GET | /vendors | 获取供应商列表 | Coordinator+ |
| POST | /vendors | 创建供应商档案 | Admin / Vendor Manager |
| GET | /vendors/:id/history | 获取供应商历史评分 | Vendor Manager |
5.3.8 交付管理
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| GET | /deliveries | 获取交付列表 | Coordinator+ |
| POST | /deliveries | 创建交付包 | Coordinator+ |
| POST | /deliveries/:id/check | 执行交付检查 | Coordinator+ |
| POST | /deliveries/:id/send | 发送交付 | Producer+ |
| PATCH | /deliveries/:id/accept | 客户签收确认 | Client |
| GET | /deliveries/:id/download | 下载交付文件 | Client(已签收) |
5.3.9 报价与变更
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| GET | /bids | 获取报价单列表 | Producer+ |
| POST | /bids | 创建报价单 | Producer |
| PUT | /bids/:id | 更新报价单 | Producer |
| POST | /bids/:id/approve | 审批报价单 | Producer+ |
| GET | /change-orders | 获取变更请求列表 | Producer+ / Client |
| POST | /change-orders | 提交变更请求 | Producer / Client |
| PATCH | /change-orders/:id/evaluate | 提交影响评估 | Supervisor |
| PATCH | /change-orders/:id/approve | 审批变更请求 | Producer |
5.3.10 风险与复盘
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| GET | /risks | 获取风险登记列表 | Producer+ |
| POST | /risks | 创建风险项 | Producer |
| PATCH | /risks/:id | 更新风险状态/措施 | Producer |
| GET | /projects/:id/post-mortem | 获取项目复盘数据 | Producer+ |
| POST | /projects/:id/post-mortem | 创建/更新复盘报告 | Producer |
5.3.11 Dailies 会议与参考
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| GET | /dailies | 获取Dailies会议列表 | 项目成员 |
| POST | /dailies | 创建Dailies会议 | Coordinator+ |
| POST | /dailies/:id/generate-notes | 生成会议纪要 | Coordinator+ |
| POST | /dailies/:id/distribute | 分发反馈到任务 | Coordinator+ |
| GET | /reference-boards | 获取参考资料板列表 | 项目成员 |
| POST | /reference-boards | 创建参考资料板 | Supervisor+ |
| POST | /reference-boards/:id/items | 添加参考素材 | Supervisor+ / Artist |
| GET | /creative-briefs/:entity_type/:entity_id | 获取创意方向板 | 项目成员 |
5.3.12 个人效能与技能
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| GET | /me/performance | 获取个人效能数据 | 已授权用户(仅本人) |
| GET | /me/work-notes | 获取个人工作笔记 | 已授权用户(仅本人) |
| POST | /me/work-notes | 创建工作笔记 | 已授权用户 |
| GET | /users/:id/skills | 获取用户技能档案 | Supervisor+ |
| PUT | /users/:id/skills | 更新技能评估 | Supervisor |
| GET | /reports/daily | 获取每日自动报告 | Coordinator+ |
| GET | /reports/weekly | 获取每周自动报告 | Producer+ |
5.3.13 客户门户专用
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| GET | /portal/projects/:id/progress | 获取项目进度概览 | Client |
| GET | /portal/feedback-history | 获取审批/反馈历史 | Client |
| POST | /portal/change-requests | 提交变更请求 | Client |
| POST | /portal/meetings/schedule | 预约审片会议 | Client |
| GET | /portal/deliveries | 获取交付物列表 | Client |
| POST | /portal/reviews/:id/structured-feedback | 提交结构化反馈 | Client |
5.4 错误码定义
| 错误码 | HTTP状态码 | 描述 | 处理建议 |
|---|---|---|---|
| AUTH_001 | 401 | 未认证或Token过期 | 刷新Token或重新登录 |
| AUTH_002 | 403 | 权限不足 | 检查用户角色权限 |
| AUTH_003 | 403 | 跨租户访问被拒 | 确认Tenant-ID |
| AUTH_004 | 401 | MFA验证失败 | 重新验证 |
| RES_001 | 404 | 资源不存在 | 检查ID是否正确 |
| RES_002 | 409 | 资源冲突(如文件已锁定) | 等待释放或联系锁定者 |
| RES_003 | 422 | 请求参数验证失败 | 检查请求体 |
| RES_004 | 409 | 状态流转非法 | 检查当前状态和目标状态 |
| RATE_001 | 429 | 请求频率超限 | 降低请求频率,参考Retry-After头 |
| SYS_001 | 500 | 服务内部错误 | 联系管理员 |
| SYS_002 | 503 | 服务暂不可用 | 稍后重试 |
| FILE_001 | 413 | 文件大小超限 | 使用分片上传 |
| FILE_002 | 409 | 文件命名不符合规范 | 检查命名规则 |
| WF_001 | 400 | 工作流配置错误(循环依赖) | 修正工作流图 |
5.5 跨平台 API 兼容
| 策略 | 描述 |
|---|---|
| 统一后端 | 三端共享同一套 REST/GraphQL API |
| 版本控制 | URL 路径版本号 /v1/,支持多版本并行 |
| 字段裁剪 | 移动端可通过 fields 参数指定返回字段,减少数据量 |
| 离线同步 | 提供 /sync/delta 增量同步接口,支持离线数据同步 |
| 压缩传输 | 支持 gzip/br 压缩,减少移动端流量 |
5.6 微服务架构规范
5.6.1 服务清单与职责边界
| 服务名称 | 语言 | 职责边界 | 数据库 | 对外协议 |
|---|---|---|---|---|
| API Gateway (Kong) | Lua/Go | 路由、限流、认证、日志 | - | HTTPS |
| User Service | Go | 用户注册/登录、组织管理、RBAC、MFA | PostgreSQL (users) | gRPC + REST |
| Project Service | Go | 项目 CRUD、实体层级(Episode/Sequence/Shot/Asset) | PostgreSQL (projects) | gRPC + REST |
| Task Service | Go | 任务生命周期、排期、依赖、甘特图数据 | PostgreSQL (tasks) | gRPC + REST |
| File Service | Go | 文件上传/下载、VFS、版本管理、锁定 | PostgreSQL (files) + MinIO | gRPC + REST |
| Review Service | Go | 审片会话、批注、审批流程、Dailies | PostgreSQL (reviews) | gRPC + REST |
| Workflow Service | Go | DAG 编排、事件触发器、门禁规则 | PostgreSQL (workflows) + Temporal | gRPC |
| Outsource Service | Go | 外包拆包、供应商管理、竞标、验收 | PostgreSQL (outsource) | gRPC + REST |
| Delivery Service | Go | 交付单管理、规格校验、客户门户 | PostgreSQL (deliveries) | gRPC + REST |
| Chat Service | Node.js | 实时聊天、频道管理、消息持久化 | PostgreSQL (chat) + Redis | WebSocket |
| Notification Service | Node.js | 多渠道通知(站内/邮件/推送/IM)、用户偏好 | PostgreSQL (notifications) + Redis | gRPC + WebSocket |
| AI Service | Python | 剧本拆解、生成式排期、语义搜索 | PostgreSQL + Milvus | gRPC + REST |
| BI Service | Go | 数据聚合、报表生成、仪表盘数据 | PostgreSQL + InfluxDB | REST + GraphQL |
| Sync Service | Go | 增量同步、离线队列处理、冲突检测 | PostgreSQL + Redis | gRPC + REST |
| Search Service | Go | 全局搜索、Elasticsearch 索引管理 | Elasticsearch | gRPC |
服务依赖关系:
┌──────────┐
│ Kong │
│ Gateway │
└────┬─────┘
┌─────┬─────┬───┼────┬──────┬──────┐
▼ ▼ ▼ ▼ ▼ ▼ ▼
User Project Task File Review Chat Notify
Svc Svc Svc Svc Svc Svc Svc
│ │ │ │ │ │ │
└──┬──┘ └──┬─┘ │ │ │
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
Workflow Outsource BI Search Sync
Svc Svc Svc Svc Svc
│ │
▼ ▼
Temporal Delivery
Svc
核心规则:服务间依赖只允许单向调用,禁止循环依赖。跨服务数据获取通过 gRPC 同步调用或 Kafka 异步事件。
5.6.2 服务间通信规范
| 配置项 | 规范 |
|---|---|
| 内部通信 | gRPC(HTTP/2 + Protobuf) |
| Proto 管理 | 独立 Git 仓库 nexus-proto,CI 自动生成各语言 stub |
| 超时设置 | 默认 5s,文件服务 30s,AI 服务 60s |
| 重试策略 | 幂等方法(GET)自动重试 3 次,非幂等方法不重试 |
| 熔断器 | 错误率 > 50%(10s 窗口)→ 熔断 30s → 半开探测 |
| 降级策略 | AI Service 不可用 → 降级为规则引擎;BI Service 不可用 → 返回缓存数据 |
| 服务发现 | K8s DNS({service}.{namespace}.svc.cluster.local) |
| 负载均衡 | gRPC 客户端负载均衡(Round Robin) |
| 链路追踪 | 所有 gRPC 调用自动注入 OpenTelemetry trace context |
| 请求标识 | 网关生成 X-Request-ID,全链路传递 |
5.6.3 分布式事务
Saga 模式(Temporal 编排):
系统使用 Temporal Workflow 编排跨服务 Saga,避免分布式事务。
| 场景 | Saga 步骤 | 补偿逻辑 |
|---|---|---|
| 创建项目 | ① User Svc 创建项目角色 → ② Project Svc 创建项目 → ③ File Svc 创建目录结构 → ④ Notify Svc 发送通知 | ④ 失败→删通知 ③ 失败→删目录 ② 失败→删项目 ① 失败→删角色 |
| 发布文件 | ① File Svc 上传存储 → ② File Svc 创建版本记录 → ③ Workflow Svc 执行门禁检查 → ④ Task Svc 更新状态 → ⑤ Notify Svc 通知 | 逆序补偿,已上传文件标记为 orphan 待清理 |
| 外包拆包 | ① Outsource Svc 创建包 → ② Task Svc 创建子任务 → ③ File Svc 准备资产包 → ④ Notify Svc 通知供应商 | 逆序补偿 |
Outbox 模式(保证消息一致性):
Service DB Transaction:
1. 写入业务表(如 tasks)
2. 写入 outbox 表(同一事务)
Outbox Relay (独立线程):
3. 轮询 outbox 表
4. 发送到 Kafka
5. 标记 outbox 记录为已发送
outbox 表结构:
CREATE TABLE outbox (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
aggregate_type VARCHAR(100) NOT NULL, -- 'task', 'file', 'review'
aggregate_id UUID NOT NULL,
event_type VARCHAR(100) NOT NULL, -- 'task.created', 'file.published'
payload JSONB NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW(),
published_at TIMESTAMPTZ NULL -- NULL = 未发送
);
CREATE INDEX idx_outbox_unpublished ON outbox (created_at) WHERE published_at IS NULL;
5.7 消息契约规范
5.7.1 Kafka Topic 清单
| Topic | 分区数 | 保留时长 | 用途 |
|---|---|---|---|
nexus.tasks.events |
12 | 7 天 | 任务状态变更、创建、删除 |
nexus.files.events |
12 | 7 天 | 文件发布、版本创建、锁定 |
nexus.reviews.events |
6 | 7 天 | 审片批注、审批状态变更 |
nexus.workflows.events |
6 | 3 天 | 工作流触发、门禁通过/拒绝 |
nexus.chat.messages |
12 | 30 天 | 聊天消息(持久化) |
nexus.notifications.commands |
6 | 3 天 | 通知发送命令 |
nexus.audit.logs |
6 | 90 天 | 审计日志 |
nexus.ai.jobs |
3 | 3 天 | AI 任务队列(排期、搜索) |
nexus.sync.changes |
12 | 24 小时 | 增量同步变更流 |
nexus.outsource.events |
3 | 7 天 | 外包流程事件 |
nexus.delivery.events |
3 | 7 天 | 交付流程事件 |
5.7.2 事件 Schema 规范
所有事件遵循 CloudEvents v1.0 规范:
{
"specversion": "1.0",
"id": "550e8400-e29b-41d4-a716-446655440000",
"source": "nexus/task-service",
"type": "nexus.task.status_changed",
"datacontenttype": "application/json",
"time": "2026-02-10T08:30:00Z",
"subject": "task/uuid-xxx",
"tenantid": "tenant-001",
"traceid": "abc123def456",
"data": {
"task_id": "uuid-xxx",
"project_id": "uuid-yyy",
"old_status": "in_progress",
"new_status": "review",
"changed_by": "user-uuid",
"changed_at": "2026-02-10T08:30:00Z"
}
}
Schema 管理:
| 配置项 | 规范 |
|---|---|
| 序列化格式 | JSON(外部)/ Protobuf(内部高吞吐场景) |
| Schema Registry | Confluent Schema Registry |
| 兼容模式 | BACKWARD(新消费者可读旧消息) |
| 版本规则 | 只加字段不删字段,删除字段先标记 deprecated |
5.7.3 典型事件定义
| 事件类型 | 生产者 | 消费者 | 业务场景 |
|---|---|---|---|
nexus.task.created |
Task Service | Notification, Workflow, Sync | 新任务分配通知、触发工作流 |
nexus.task.status_changed |
Task Service | Notification, BI, Workflow, Sync | 状态变更通知、数据统计更新 |
nexus.file.published |
File Service | Task, Notification, Workflow, Sync | 更新任务产出、通知下游、触发质检 |
nexus.file.locked |
File Service | Notification, Sync | 通知相关用户文件被锁 |
nexus.review.approved |
Review Service | Task, Notification, Workflow | 自动推进任务状态、通知相关人 |
nexus.review.retake |
Review Service | Task, Notification | Retake 回退任务状态、通知艺术家 |
nexus.workflow.gate_passed |
Workflow Service | Task, File, Notification | 门禁通过,推进下一阶段 |
nexus.chat.mentioned |
Chat Service | Notification | @ 提及生成站内通知 |
nexus.outsource.submitted |
Outsource Service | Notification, File | 外包提交,触发验收流程 |
nexus.delivery.approved |
Delivery Service | Notification, File | 交付通过,归档交付物 |
5.7.4 死信队列与重试
| 配置项 | 规范 |
|---|---|
| 消费重试 | 3 次,指数退避(1s → 5s → 25s) |
| 死信 Topic | {original_topic}.dlq(如 nexus.tasks.events.dlq) |
| DLQ 保留 | 30 天 |
| 监控告警 | DLQ 消息数 > 0 → WARN,> 100 → CRITICAL |
| 人工处理 | 运维工具支持查看、重放、丢弃 DLQ 消息 |
| 幂等消费 | 消费者维护 processed_events 表,按 event_id 去重 |
5.8 后端通用规范
5.8.1 缓存策略
Redis Key 命名规则: {tenant}:{service}:{entity}:{id}:{field}
| 缓存场景 | Key 示例 | TTL | 更新策略 |
|---|---|---|---|
| 用户会话 | t001:user:session:uuid |
15min | 写穿透(Write-Through) |
| 项目配置 | t001:project:config:uuid |
1h | 写失效(Cache-Aside) |
| 任务计数 | t001:task:count:project-uuid |
5min | 事件驱动失效 |
| 权限矩阵 | t001:rbac:permissions:role-id |
30min | 权限变更时主动失效 |
| 热点文件元数据 | t001:file:meta:uuid |
10min | 文件更新时失效 |
缓存防护:
| 问题 | 防护策略 |
|---|---|
| 缓存穿透 | 布隆过滤器(Bloom Filter)拦截不存在的 Key |
| 缓存击穿 | singleflight(Go)/ 互斥锁,同一 Key 只有一个请求穿透到 DB |
| 缓存雪崩 | TTL 加随机抖动(±10%),避免同时过期 |
| 缓存预热 | 服务启动时预加载热点数据(项目列表、权限矩阵) |
5.8.2 配置管理
| 配置类型 | 存储方式 | 更新方式 |
|---|---|---|
| 静态配置 | 环境变量 + ConfigMap(K8s) | 需重启/滚动更新 |
| 动态配置 | Consul KV | 实时生效(Watch 机制) |
| 密钥/凭证 | HashiCorp Vault | 动态获取,TTL 24h 自动轮换 |
| 功能开关 | Consul KV + 自建 Feature Flag | 实时生效,支持灰度百分比 |
环境变量命名规则: NEXUS_{SERVICE}_{CONFIG},如 NEXUS_TASK_DB_HOST
5.8.3 服务治理
| 治理项 | 规范 |
|---|---|
| 熔断器 | 基于 go-resilience / gobreaker,阈值:50% 错误率 / 10s 窗口 |
| 超时链 | Gateway 30s → Service 10s → DB Query 5s → External Call 5s |
| 限流 | Kong 全局 10,000 RPS;单租户 1,000 RPS;单用户 100 RPS |
| 降级 | 各服务定义降级策略文档(如 AI 不可用时返回空推荐) |
| 健康检查 | /health/live(存活)+ /health/ready(就绪,含 DB/Redis 连通性) |
| 优雅关闭 | 收到 SIGTERM → 停止接收新请求 → 等待在途请求完成(超时 30s)→ 退出 |
5.8.4 数据校验
| 语言 | 校验框架 | 规范 |
|---|---|---|
| Go | go-playground/validator |
struct tag 校验 + 自定义校验器 |
| Python | Pydantic v2 | 模型校验 + 自定义 validator |
| Node.js | Zod | Schema 定义 + 运行时校验 |
校验错误统一返回格式:
{
"error": {
"code": "RES_003",
"message": "Validation failed",
"details": [
{"field": "name", "message": "Name is required", "rule": "required"},
{"field": "due_date", "message": "Due date must be in the future", "rule": "future_date"}
]
}
}
6. 性能要求
6.1 PC Web 端
| 指标 | 目标值 | 测量条件 |
|---|---|---|
| 首屏加载时间 (FCP) | ≤ 1.5s | 4G网络,首次访问 |
| 可交互时间 (TTI) | ≤ 3s | 4G网络,首次访问 |
| 页面切换 | ≤ 500ms | 缓存命中 |
| 甘特图渲染(1000任务) | ≤ 2s | 初次加载 |
| 电子表格(10万行) | ≤ 1s | 虚拟滚动 |
| 审片播放器启动 | ≤ 3s | 开始播放到第一帧显示 |
| API平均响应 | ≤ 200ms | P95 ≤ 500ms |
| WebSocket消息延迟 | ≤ 100ms | 同区域 |
| 并发用户支持 | ≥ 5,000 | 同时在线 |
| 资源包大小 | ≤ 2MB | gzip压缩后首包 |
优化策略:
- CDN 加速静态资源
- 代码分割 (Code Splitting) 按路由懒加载
- 图片 WebP 格式 + 响应式尺寸
- Service Worker 缓存策略
- 虚拟滚动处理大列表/大表格
6.2 PC 桌面应用端
| 指标 | 目标值 | 测量条件 |
|---|---|---|
| 应用启动时间 | ≤ 3s | 冷启动(SSD) |
| 内存占用(空闲) | ≤ 200MB | 无项目打开 |
| 内存占用(工作中) | ≤ 800MB | 打开一个项目 |
| DCC插件加载 | ≤ 2s | Maya/Nuke内加载面板 |
| 文件上传速度 | ≥ 局域网80%带宽 | 本地NAS |
| 文件下载速度 | ≥ 局域网80%带宽 | 本地NAS |
| 本地缓存大小 | 可配置(默认50GB) | 自动管理 |
| 离线模式切换 | ≤ 1s | 网络断开检测到UI切换 |
优化策略:
- Tauri 框架比 Electron 内存占用低 50%+
- 本地 SQLite 缓存减少网络请求
- 文件传输使用多线程分片
- GPU 加速 UI 渲染
6.3 移动端
| 指标 | 目标值 | 测量条件 |
|---|---|---|
| App 启动时间(冷启动) | ≤ 2s | iPhone 12 / 中端Android |
| App 启动时间(热启动) | ≤ 500ms | 后台切回 |
| 内存占用 | ≤ 150MB | 正常使用 |
| 审片视频加载 | ≤ 3s | 4G网络,1080p |
| 页面切换动画 | 60fps | 流畅无卡顿 |
| 电池消耗 | ≤ 5%/h | 正常使用(非视频播放) |
| 离线数据包大小 | ≤ 500MB | 单项目 |
| 推送通知到达 | ≤ 5s | APNs/FCM |
| 安装包大小 | ≤ 80MB | 首次下载 |
优化策略:
- Flutter AOT 编译提升运行性能
- 图片懒加载 + 渐进式加载
- 视频自适应码率(根据网络自动切换 480p/720p/1080p)
- 后台任务使用 WorkManager/BGTaskScheduler
- 减少不必要的后台网络请求
6.4 并发与可扩展性
| 指标 | 目标值 |
|---|---|
| API 并发请求 | 10,000 RPS(可水平扩展) |
| WebSocket 连接数 | 50,000 同时在线 |
| 数据库连接池 | 每个服务实例 50 连接 |
| 文件并发上传 | 500 个并发传输任务 |
| Kafka 消息吞吐 | 100,000 msg/s |
| Elasticsearch 索引 | 亿级文档,查询 ≤ 100ms |
7. 安全性要求
7.1 安全合规框架
系统的安全设计严格遵循 MPAA(美国电影协会) 和 TPN(Trusted Partner Network) 安全最佳实践,同时满足 ISO 27001 信息安全管理标准。
7.2 数据保护
7.2.1 传输加密
| 场景 | 加密方式 | 要求 |
|---|---|---|
| API 通信 | TLS 1.3 | 强制 HTTPS,禁用 TLS 1.0/1.1 |
| WebSocket | WSS | TLS 加密 |
| 文件传输 | TLS + AES-256 | 端到端加密 |
| 跨区域同步 | VPN + TLS | 站点间专用加密通道 |
| 移动端通信 | Certificate Pinning | 防止中间人攻击 |
7.2.2 存储加密
| 数据类型 | 加密方式 |
|---|---|
| 数据库敏感字段 | AES-256-GCM 应用层加密 |
| 用户密码 | Argon2id 哈希(不可逆) |
| 文件存储 | SSE-S3(服务端加密)或 CSE(客户端加密) |
| 备份数据 | AES-256 加密 |
| 移动端离线数据 | iOS Keychain / Android EncryptedSharedPreferences |
| API Keys / Tokens | Vault 密钥管理 |
7.3 零信任网络访问 (ZTNA)
| 安全层 | 措施 |
|---|---|
| 身份验证 | OAuth 2.0 + MFA(所有API调用均需认证) |
| 设备信任 | 设备指纹识别,非信任设备需额外验证 |
| 网络分段 | 微服务间通过 mTLS 双向认证 |
| 最小权限 | RBAC + 属性级权限控制 |
| 持续验证 | Token 定期刷新,异常行为自动注销 |
7.4 RBAC 权限控制
权限粒度层级:
全局权限 (System Level)
└─ 租户权限 (Tenant Level)
└─ 项目权限 (Project Level)
└─ 实体权限 (Entity Level)
└─ 字段权限 (Field Level)
特殊安全场景:
| 场景 | 安全措施 |
|---|---|
| 外包人员 (Vendor) | 只能看到指派的特定 Task,不可浏览其他资产,不可下载源文件 |
| 客户审片 | 分享链接带过期时间和密码保护,强制水印 |
| 高管仪表盘 | 财务数据加密传输,仅限制定角色查看 |
| 离职人员 | 账户立即停用,所有活跃Session强制注销 |
7.5 数字水印
| 水印类型 | 应用场景 | 内容 |
|---|---|---|
| 动态可见水印 | 审片播放器、客户门户 | 用户名 + IP + 时间戳 |
| 隐式数字水印 | 高安全项目的文件下载 | 不可见的隐写术水印 |
| 屏幕录制检测 | 桌面端审片 | 检测到录屏软件时自动模糊画面 |
7.6 物理隔离支持
对于顶级保密项目,支持完全私有化部署 (Air-gapped):
- 切断所有外网连接,仅在局域网内运行
- 所有服务(包括 AI 模型)部署在本地
- 独立的证书体系和密钥管理
- USB 设备接入控制
7.7 跨平台安全一致性
| 安全项 | Web端 | 桌面端 | 移动端 |
|---|---|---|---|
| HTTPS 强制 | 是 | 是 | 是 (Certificate Pinning) |
| Token 存储 | HttpOnly Cookie | OS Keychain | Secure Storage |
| 生物识别 | - | - | Face ID / 指纹 |
| 屏幕保护 | 无操作15min锁屏 | 跟随系统 | 后台自动模糊 |
| 剪贴板保护 | 敏感数据禁止复制 | 同左 | 同左 |
| 截屏控制 | 水印 | 水印+录屏检测 | 禁止截屏(可配置) |
8. 日志与监控
8.1 日志体系
8.1.1 日志级别定义
| 级别 | 用途 | 示例 |
|---|---|---|
| TRACE | 详细调试信息 | 函数进出、变量值 |
| DEBUG | 调试阶段信息 | SQL查询、API请求详情 |
| INFO | 正常业务事件 | 用户登录、任务创建、文件发布 |
| WARN | 潜在问题警告 | 磁盘空间低于 20%、API响应慢 |
| ERROR | 错误但不影响整体 | 单次API调用失败、文件上传异常 |
| FATAL | 严重错误需立即处理 | 服务崩溃、数据库连接断开 |
8.1.2 日志记录规范
业务操作日志:
{
"timestamp": "2026-02-10T14:30:00Z",
"level": "INFO",
"service": "task-service",
"trace_id": "abc123",
"user_id": "usr_xxx",
"tenant_id": "tnt_xxx",
"action": "task.status_changed",
"entity_type": "task",
"entity_id": "tsk_xxx",
"details": {
"old_status": "in_progress",
"new_status": "pending_review"
}
}
8.1.3 日志存储策略
| 日志类型 | 存储位置 | 保留周期 |
|---|---|---|
| 应用日志 | ELK Stack / Loki | 90 天(热) + 1 年(冷) |
| 审计日志 | PostgreSQL(独立库) | 3 年(不可删除) |
| 访问日志 | Elasticsearch | 1 年 |
| 安全日志 | 独立加密存储 | 5 年 |
| 性能日志 | InfluxDB | 30 天(详细) + 1 年(聚合) |
8.2 监控体系
8.2.1 关键指标 (KPIs)
基础设施层:
| 指标 | 正常范围 | 告警阈值 |
|---|---|---|
| CPU 使用率 | < 60% | > 80% (WARN), > 95% (CRITICAL) |
| 内存使用率 | < 70% | > 85% (WARN), > 95% (CRITICAL) |
| 磁盘使用率 | < 75% | > 85% (WARN), > 95% (CRITICAL) |
| 网络带宽 | < 60% | > 80% (WARN) |
应用层:
| 指标 | 正常范围 | 告警阈值 |
|---|---|---|
| API 响应时间 (P95) | < 500ms | > 1s (WARN), > 3s (CRITICAL) |
| API 错误率 | < 0.1% | > 1% (WARN), > 5% (CRITICAL) |
| WebSocket 连接数 | - | 单节点 > 10,000 (WARN) |
| 数据库连接池 | < 80% | > 90% (WARN) |
| 消息队列积压 | < 1,000 | > 10,000 (WARN), > 100,000 (CRITICAL) |
业务层:
| 指标 | 描述 | 告警条件 |
|---|---|---|
| 文件上传失败率 | 上传失败/上传总数 | > 5% |
| 审片转码队列 | 等待转码的任务数 | > 50 |
| 用户活跃度 | DAU / 总用户数 | < 30% (WARN) |
| 触发器失败率 | 自动化执行失败 | > 10% |
8.2.2 监控工具链
数据采集 存储与处理 可视化与告警
───────── ────────── ──────────
Prometheus (指标) ──→ Prometheus TSDB ──→ Grafana 仪表盘
Filebeat (日志) ──→ Elasticsearch ──→ Kibana 分析
Jaeger (链路追踪) ──→ Jaeger Storage ──→ Jaeger UI
自定义Exporter ──→ InfluxDB ──→ Grafana
│
▼
AlertManager
│
┌────────┼────────┐
▼ ▼ ▼
邮件 钉钉/Slack 短信
8.2.3 报警机制
| 报警级别 | 响应时间 | 通知方式 | 升级策略 |
|---|---|---|---|
| INFO | 次日处理 | 邮件/站内 | - |
| WARN | 4 小时内 | 邮件 + IM | 4h未处理升级为CRITICAL |
| CRITICAL | 30 分钟内 | IM + 短信 + 电话 | 30min未处理通知CTO |
| FATAL | 立即响应 | 全渠道通知 | 自动触发应急预案 |
8.2.4 SLO 联动告警
基于 Error Budget 的分级告警策略:
| Error Budget 消耗速率 | 告警级别 | 行为 |
|---|---|---|
| 正常(< 1x 消耗率) | 无告警 | - |
| 快速消耗(1x - 5x) | WARN | 通知值班人员关注 |
| 高速消耗(5x - 10x) | CRITICAL | 启动调查,考虑暂停发布 |
| 极速消耗(> 10x) | FATAL | 立即回滚最近变更,全员参与 |
Burn Rate 告警规则示例:
# Prometheus AlertManager 规则
- alert: HighErrorBudgetBurnRate
expr: |
(1 - (sum(rate(http_requests_total{code!~"5.."}[1h]))
/ sum(rate(http_requests_total[1h]))))
> (1 - 0.999) * 14.4
for: 5m
labels:
severity: critical
annotations:
summary: "API error budget burning too fast"
8.2.5 On-Call 机制
值班排班:
| 配置项 | 规范 |
|---|---|
| 排班周期 | 周轮换,至少 2 人同时在班(主 + 备) |
| 覆盖时间 | 7×24(工作日 SRE 轮值,非工作日减半人数) |
| 工具 | PagerDuty / 飞书告警机器人 |
| 交接 | 每周一上午交接会,review 上周事件和待办 |
升级路径:
| 时间 | 升级行为 |
|---|---|
| 0-5min | 主值班响应(ACK 告警) |
| 5-15min | 主值班未响应 → 自动通知备值班 |
| 15-30min | 备值班未响应 → 通知 SRE Lead |
| 30min-1h | 升级至 Engineering Manager |
| > 1h | 升级至 CTO,启动 War Room |
事故分级:
| 等级 | 影响范围 | 响应团队 | 复盘要求 |
|---|---|---|---|
| P0 | 全站不可用 / 数据丢失 | War Room(全员) | 3 天内完成 Post-Mortem |
| P1 | 核心功能不可用 | SRE + 相关开发 | 5 天内完成 Post-Mortem |
| P2 | 非核心功能异常 | 值班人员 | 周度回顾 |
| P3 | 轻微异常 / 性能下降 | 自行处理 | 月度统计 |
8.2.6 日志脱敏
PII 字段自动脱敏规则:
| 字段类型 | 脱敏策略 | 示例 |
|---|---|---|
| 邮箱 | 保留域名 | z***@example.com |
| 手机号 | 保留前 3 后 4 | 138****5678 |
| 姓名 | 保留姓 | 张** |
| IP 地址 | 保留前两段 | 192.168.*.* |
| Token/密码 | 完全替换 | [REDACTED] |
| 文件路径 | 保留项目名 | project_a/.../file.ma |
实现方式:
- 应用层:结构化日志中间件自动检测并脱敏 PII 字段
- 日志采集层:Filebeat 处理器二次脱敏(兜底)
- 审计日志:不脱敏(加密存储,仅安全团队可访问)
8.2.7 成本监控
| 监控维度 | 指标 | 数据来源 | 告警阈值 |
|---|---|---|---|
| 按服务 | CPU/内存/网络流量费用 | K8s metrics + 云账单 API | 月环比增长 > 30% |
| 按租户 | 存储用量、API 调用量、带宽 | 应用层计量 | 超出配额 80% |
| 数据库 | 连接数、存储增长、IOPS | CloudWatch / pg_stat | 存储增速异常 |
| 文件存储 | 总存储量、月增长量、冗余率 | MinIO metrics | 年底预估超容量 |
| AI 推理 | GPU 使用时长、推理请求数 | NVIDIA DCGM + 应用日志 | 日费用 > 预算 120% |
成本优化措施:
| 措施 | 预期节省 |
|---|---|
| 非工作时间 Dev/Staging 缩容 (HPA min=1) | 30-40% |
| 冷数据自动转 S3 Glacier | 20-30% 存储费 |
| Redis 内存优化(压缩 + 过期清理) | 15-20% |
| CDN 缓存命中率优化(目标 > 95%) | 10-15% 带宽费 |
| 预留实例 / Savings Plans(年付) | 30-40% 计算费 |
9. 测试与验收
9.1 测试策略总览
| 测试类型 | 覆盖目标 | 工具 | 执行频率 |
|---|---|---|---|
| 单元测试 | 代码覆盖率 ≥ 80% | Jest/Go test/pytest | 每次提交 |
| 集成测试 | API 接口正确性 | Postman/Newman | 每次PR |
| E2E 测试 | 核心业务流程 | Playwright/Cypress | 每日 |
| 性能测试 | 响应时间/并发/吞吐 | k6/Locust | 每次发版前 |
| 安全测试 | 漏洞扫描/渗透测试 | OWASP ZAP/Burp Suite | 每月 |
| UI 测试 | 视觉一致性 | Chromatic/Percy | 每次PR |
| 兼容性测试 | 多浏览器/设备 | BrowserStack/LambdaTest | 每次发版前 |
9.2 功能测试
9.2.1 核心业务流程测试用例
| 测试场景 | 描述 | 验收标准 |
|---|---|---|
| 任务全生命周期 | 创建→分配→执行→审核→完成 | 状态流转正确,通知及时 |
| 文件发布流程 | DCC内Smart Publish到审片可见 | 版本号递增,缩略图生成,门禁检查 |
| 审片工作流 | 上传→批注→Approve/Retake→通知 | 批注帧精确,状态同步 |
| 跨端数据同步 | Web修改 → 移动端可见 | 延迟 < 3s |
| 离线→在线同步 | 移动端离线批注 → 联网后同步 | 数据无丢失,冲突正确处理 |
| 多地协作 | 上海发布 → 成都预取 → 本地读取 | 文件一致,速度达标 |
9.2.2 边界与异常测试
| 测试场景 | 描述 |
|---|---|
| 并发锁冲突 | 两人同时尝试锁定同一文件 |
| 循环依赖 | 创建形成环路的任务依赖 |
| 大文件上传 | 上传 100GB+ 文件,网络中断后续传 |
| 权限越权 | Vendor角色尝试访问未授权资源 |
| Token过期 | 操作过程中Token过期的平滑处理 |
| 高并发写入 | 1000人同时更新同一项目的任务 |
9.3 UI 测试
| 测试维度 | 内容 | 标准 |
|---|---|---|
| 视觉回归 | 截图对比检测UI变化 | Pixel diff < 0.1% |
| 响应式布局 | 各断点布局正确性 | 无元素重叠/溢出 |
| 深色/浅色模式 | 两种主题均可用 | 对比度符合WCAG AA |
| 国际化 | 中/英文界面完整性 | 无截断/溢出 |
| 无障碍 | ARIA标签、键盘导航 | WCAG 2.1 AA |
9.4 性能测试
| 测试场景 | 并发数 | 持续时间 | 关注指标 |
|---|---|---|---|
| 正常负载 | 1,000 | 1小时 | P95延迟 < 500ms |
| 峰值负载 | 5,000 | 30分钟 | P99延迟 < 2s,无报错 |
| 压力测试 | 10,000 | 15分钟 | 系统不崩溃,优雅降级 |
| 持久测试 | 500 | 24小时 | 无内存泄漏,性能稳定 |
| 大数据量 | - | - | 百万任务查询 < 1s |
9.5 平台适配测试
| 平台 | 测试设备/环境 |
|---|---|
| Web (Chrome) | Windows 10/11, macOS 14, Ubuntu 22.04 |
| Web (Firefox) | Windows 10/11, macOS 14 |
| Web (Safari) | macOS 14, iOS 17 (iPad) |
| 桌面端 (Windows) | Windows 10/11, 8GB+ RAM |
| 桌面端 (macOS) | macOS 12+, M1/M2/Intel |
| 桌面端 (Linux) | Ubuntu 20.04/22.04, CentOS 7 |
| iOS | iPhone 13/14/15, iPad Pro |
| Android | Pixel 7, Samsung S23, 中端设备 |
| DCC插件 | Maya 2024, Nuke 14, Houdini 20 |
10. 部署与运维
10.1 部署架构
10.1.1 混合云部署拓扑
┌─────────────────────────────┐
│ 云端核心 │
│ │
│ ┌─────────┐ ┌──────────┐ │
│ │ K8s集群 │ │ 数据库集群│ │
│ │(API/Web) │ │(PG/Redis)│ │
│ └─────────┘ └──────────┘ │
│ ┌─────────┐ ┌──────────┐ │
│ │AI服务集群│ │对象存储 │ │
│ │(GPU节点) │ │(S3/OSS) │ │
│ └─────────┘ └──────────┘ │
│ ┌─────────┐ │
│ │CDN/WAF │ │
│ └─────────┘ │
└──────────┬──────────────────┘
│ VPN / 专线
┌──────────────────┼──────────────────┐
│ │ │
┌─────────▼──────┐ ┌────────▼────────┐ ┌──────▼──────────┐
│ 上海工作室 │ │ 成都工作室 │ │ 温哥华工作室 │
│ │ │ │ │ │
│ NEXUS Gateway │ │ NEXUS Gateway │ │ NEXUS Gateway │
│ • DB读缓存 │ │ • DB读缓存 │ │ • DB读缓存 │
│ • 文件缓存 │ │ • 文件缓存 │ │ • 文件缓存 │
│ • LDAP代理 │ │ • LDAP代理 │ │ • LDAP代理 │
│ • 传输加速 │ │ • 传输加速 │ │ • 传输加速 │
│ │ │ │ │ │
│ Local NAS │ │ Local NAS │ │ Local NAS │
│ (Isilon/Qumulo)│ │ (Isilon/Qumulo) │ │ (Isilon/Qumulo) │
└────────────────┘ └─────────────────┘ └─────────────────┘
10.1.2 Kubernetes 部署配置
| 服务 | 副本数(生产) | 资源限制 | HPA策略 |
|---|---|---|---|
| API Gateway | 3 | 2CPU / 4GB | CPU > 70% 扩容 |
| Task Service | 3 | 2CPU / 4GB | RPS > 1000 扩容 |
| File Service | 3 | 4CPU / 8GB | 上传队列 > 100 扩容 |
| Review Service | 2 | 4CPU / 8GB | 转码队列 > 20 扩容 |
| Chat Service | 3 | 2CPU / 4GB | WebSocket > 5000 扩容 |
| AI Service | 2 (GPU) | 8CPU / 16GB / 1GPU | 请求队列 > 10 扩容 |
| Notification Service | 2 | 1CPU / 2GB | 消息积压 > 5000 扩容 |
10.2 PC Web 端部署
| 组件 | 方案 |
|---|---|
| 静态资源 | CDN 部署(阿里云CDN/CloudFront) |
| HTTPS | Let's Encrypt 自动续签 / 企业SSL证书 |
| WAF | 云WAF防护(SQL注入/XSS/DDoS) |
| 灰度发布 | 基于用户/租户的灰度策略 |
| 回滚 | 保留最近 5 个版本,一键回滚 |
10.3 PC 桌面应用端部署
| 平台 | 安装包格式 | 分发方式 |
|---|---|---|
| Windows | .msi + .exe | 自动更新服务 + 企业内网分发 |
| macOS | .dmg + .pkg | 自动更新服务 + 企业MDM |
| Linux | .deb + .AppImage | APT仓库 + 自动更新 |
自动更新机制:
- 增量更新(Delta Update):仅下载变更部分
- 静默更新:后台下载,提示用户重启应用
- 强制更新:安全补丁强制升级
- 版本通道:Stable / Beta / Nightly
10.4 移动端部署
| 平台 | 分发渠道 | 审核周期 |
|---|---|---|
| iOS | App Store + 企业证书(In-House) | 1-3工作日 |
| Android | Google Play + 企业内网APK | 即时(内网) / 1天(Play) |
| iPadOS | App Store (通用应用) | 同iOS |
热更新策略:
- Flutter 不支持原生热更新,采用"功能开关(Feature Flag)"控制新功能上线
- 紧急修复通过加速审核通道
10.5 运维支持
10.5.1 版本管理策略
| 策略 | 描述 |
|---|---|
| 语义化版本 | MAJOR.MINOR.PATCH (如 1.2.3) |
| 发版节奏 | Major: 半年, Minor: 月度, Patch: 按需 |
| 变更日志 | 每次发版附带 CHANGELOG |
| API 兼容 | Minor 版本向后兼容,Major 版本可能有破坏性变更 |
| 数据迁移 | 版本升级自动执行数据库 Migration |
10.5.2 问题追踪与应急
| 工具/流程 | 用途 |
|---|---|
| Sentry | 前端/移动端错误自动采集 |
| PagerDuty / 飞书告警 | On-call 值班告警 |
| Runbook | 标准化应急处理手册 |
| 事后复盘 | P0/P1 事故必须复盘 |
10.5.3 备份与容灾
| 数据类型 | 备份策略 | RPO | RTO |
|---|---|---|---|
| 数据库 | 每日全量 + 实时WAL归档 | 0 (零数据丢失) | < 1h |
| 文件存储 | 跨区域冗余 + 每周校验 | 0 | < 4h |
| 配置数据 | Git版本管理 + 每日备份 | < 1h | < 30min |
| Redis缓存 | RDB + AOF 持久化 | < 1min | < 10min |
10.6 CI/CD 流水线详细设计
10.6.1 Pipeline 架构
代码提交 (Git Push)
│
▼
┌─────────── CI 阶段 ───────────┐
│ 1. Lint Check (ESLint/golint) │
│ 2. Unit Test (覆盖率 ≥ 80%) │
│ 3. Build (多阶段 Docker) │
│ 4. Security Scan (Trivy) │
│ 5. Push to Registry (Harbor) │
└────────────┬──────────────────┘
▼
┌─────────── CD 阶段 ───────────┐
│ 6. Deploy to Dev (自动) │
│ 7. Integration Test │
│ 8. Deploy to Staging (自动) │
│ 9. E2E Test (Playwright) │
│ 10. Manual Approval Gate │
│ 11. Deploy to Prod (金丝雀) │
└───────────────────────────────┘
10.6.2 环境定义
| 环境 | 用途 | 数据 | 访问控制 | 部署方式 |
|---|---|---|---|---|
| Dev | 开发联调 | 模拟数据,可自由重置 | 开发团队 | 自动(push to main) |
| Staging | 预发布验证 | 生产脱敏数据 | 测试团队 + PM | 自动(CI 通过后) |
| Prod | 线上生产 | 真实数据 | 运维 + 审批 | 手动审批 + 金丝雀 |
数据脱敏规则(Staging):
| 字段类型 | 脱敏策略 |
|---|---|
| 用户姓名 | 保留姓 + 脱敏名(如"张**") |
| 邮箱 | 保留域名 + 脱敏前缀(z***@example.com) |
| 手机号 | 保留前 3 后 4(138****5678) |
| 文件内容 | 替换为占位图/视频 |
| 密码/Token | 完全移除 |
10.6.3 构建策略
| 配置项 | 规范 |
|---|---|
| Docker 构建 | 多阶段构建(builder → runner),最小化镜像(Alpine/Distroless) |
| 镜像标签 | {service}:{git-sha-short}-{timestamp}(如 task-svc:a1b2c3d-20260210) |
| 语义版本 | Release 时追加 {service}:v1.2.3 |
| 镜像仓库 | Harbor(自建)或 AWS ECR,按环境隔离仓库 |
| 构建缓存 | Docker BuildKit + GitHub Actions Cache |
| 产物保留 | Dev 镜像保留 7 天,Staging 30 天,Prod 永久 |
10.6.4 发布策略
| 策略 | 描述 | 适用场景 |
|---|---|---|
| 金丝雀发布 | 5% → 25% → 50% → 100%,每阶段观察 15 分钟 | 常规发布 |
| 蓝绿切换 | 部署新版本到绿色环境 → 切换流量 → 保留蓝色回滚 | 重大版本变更 |
| 回滚 | 切换到上一版本镜像,< 5 分钟完成 | 紧急回退 |
| Feature Flag | 新功能通过开关控制灰度百分比 | 渐进式功能开放 |
金丝雀发布自动化指标:
- 错误率增幅 < 0.1% → 继续
- P95 延迟增幅 < 20% → 继续
- 指标异常 → 自动回滚 + 告警
10.6.5 数据库 Migration 在 CI/CD 中的执行
| 阶段 | 行为 |
|---|---|
| CI | 测试库执行 up + down 迁移验证,检查兼容性 |
| Deploy Dev | 自动执行迁移 |
| Deploy Staging | 自动执行迁移,DBA 审核通知 |
| Deploy Prod | pre-deploy Job 执行迁移,锁超时 5s,失败自动取消部署 |
| 回滚 | 如迁移可逆执行 down,否则修复性迁移(forward-fix) |
10.6.6 安全扫描
| 扫描类型 | 工具 | 执行时机 | 阻断策略 |
|---|---|---|---|
| 容器镜像 | Trivy | 每次构建 | Critical / High 漏洞阻断 |
| 依赖检查 | Snyk / Dependabot | 每次 PR | Known Exploit 阻断 |
| 代码质量 | SonarQube | 每次 PR | 覆盖率 < 80% 或新增 Bug 阻断 |
| 密钥泄露 | GitLeaks | 每次提交 | 发现密钥立即阻断 |
| License | FOSSA | 每次 PR | GPL 等传染性许可证阻断 |
10.7 SLO/SLI 定义
10.7.1 服务级别指标 (SLI)
| SLI 名称 | 计算方式 | 数据来源 |
|---|---|---|
| API 可用性 | 成功请求数 / 总请求数(排除 4xx) | Prometheus |
| API 延迟 | P50 / P95 / P99 响应时间 | Prometheus histogram |
| 文件上传成功率 | 上传成功数 / 上传总数 | 应用日志 |
| WebSocket 稳定性 | 1 - (异常断连数 / 活跃连接数·小时) | Socket.IO metrics |
| 审片播放成功率 | 播放成功数 / 播放请求数 | 客户端上报 |
| 推送送达率 | 送达确认数 / 推送总数 | APNs/FCM 回执 |
10.7.2 服务级别目标 (SLO)
| SLO | 目标值 | 计算窗口 | Error Budget |
|---|---|---|---|
| API 可用性 | 99.9% | 月度(30 天滚动) | 43.2 分钟/月 |
| REST API P95 延迟 | < 200ms | 月度 | - |
| GraphQL P95 延迟 | < 500ms | 月度 | - |
| 文件上传成功率 | 99.95% | 月度 | 21.6 分钟/月 |
| WebSocket 稳定性 | 99.9% | 月度 | - |
| 审片播放成功率 | 99.5% | 月度 | - |
| 推送送达率 (5s 内) | 99.0% | 月度 | - |
10.7.3 Error Budget 策略
| Error Budget 剩余 | 行为 |
|---|---|
| > 50% | 正常迭代,允许功能发布 |
| 25% - 50% | 减少发布频率,增加发布前测试 |
| 10% - 25% | 冻结非关键功能发布,聚焦稳定性 |
| < 10% | 冻结所有功能发布,全力修复稳定性 |
| 耗尽 (0%) | 触发事故复盘,制定改进计划后才能恢复发布 |
10.8 灾备与高可用
10.8.1 组件 HA 配置
| 组件 | HA 方案 | 最小副本 | 故障切换时间 |
|---|---|---|---|
| K8s Control Plane | 多 AZ 部署(3 Master) | 3 | 自动 < 30s |
| PostgreSQL | Patroni 管理主备(同步复制) | 1 主 + 2 备 | 自动 < 30s |
| Redis | Redis Sentinel(3 哨兵) | 1 主 + 2 从 | 自动 < 15s |
| Kafka | 多副本(replication.factor=3) |
3 Broker | 自动 < 30s |
| Elasticsearch | 多节点集群(3 Master + 2 Data) | 5 | 自动 < 60s |
| MinIO | 纠删码模式(Erasure Coding) | 4 节点 | 自动 |
| Temporal | 多实例部署 | 3 | 自动 < 30s |
10.8.2 故障切换流程
数据库主库故障:
1. Patroni 检测主库不可达 (3 次心跳失败,约 15s)
2. Patroni 选举新主库 (同步副本优先)
3. PgBouncer 自动更新路由 (< 5s)
4. 应用层短暂连接失败 → 自动重试 → 恢复
5. 总故障时间 < 30s
6. 运维值班人员收到告警 → 检查旧主库 → 修复后作为新副本加入
AZ 级故障:
1. K8s 检测节点不可达
2. Pod 在其他 AZ 自动调度 (< 2min)
3. 有状态服务(DB/Redis)由 HA 机制保证
4. DNS / Ingress 自动路由到健康 AZ
5. 总恢复时间 < 5min
10.8.3 灾难恢复演练
| 演练场景 | 频率 | 预期恢复时间 | 参与人 |
|---|---|---|---|
| DB 主库故障 | 每季度 | < 30s (自动) | DBA + SRE |
| 单 AZ 故障 | 每半年 | < 5min | SRE + 基础设施 |
| Redis 主节点故障 | 每季度 | < 15s (自动) | SRE |
| Kafka Broker 宕机 | 每半年 | < 30s (自动) | SRE |
| 全站数据恢复(PITR) | 每年 | < 1h | DBA + SRE + CTO |
| 边缘节点断连 | 每季度 | 0s (自治运行) | SRE + 现场IT |
10.8.4 业务连续性 (BCP)
服务恢复优先级:
| 优先级 | 服务 | 原因 | 最大容忍停机 |
|---|---|---|---|
| P0 | API Gateway + User Service | 所有请求入口 + 认证 | 0 (HA 保证) |
| P1 | File Service | 艺术家无法工作 | 5min |
| P2 | Task Service | 无法查看/更新任务 | 15min |
| P3 | Review Service | 无法审片 | 30min |
| P4 | Chat Service | 替代方案:邮件/Slack | 1h |
| P5 | BI Service | 不影响生产 | 4h |
| P6 | AI Service | 降级为手动操作 | 24h |
10.9 运维文档体系
10.9.1 Runbook 目录
| Runbook 编号 | 场景 | 触发条件 |
|---|---|---|
| RB-001 | PostgreSQL 主库故障恢复 | DB 主库不可达告警 |
| RB-002 | Redis 内存溢出处理 | Redis 内存使用 > 90% |
| RB-003 | Kafka 消息积压处理 | 积压 > 10,000 |
| RB-004 | API 响应时间异常 | P95 > 1s 持续 5min |
| RB-005 | 文件存储空间不足 | MinIO 使用率 > 85% |
| RB-006 | 边缘节点连接断开 | 边缘节点 > 5min 无心跳 |
| RB-007 | 安全事件应急 | WAF 告警 / 异常访问模式 |
| RB-008 | 版本回滚流程 | 发布后指标异常 |
| RB-009 | 证书过期处理 | 证书到期 < 7 天告警 |
| RB-010 | DDoS 应对 | 流量异常增长 > 10x |
10.9.2 变更管理
| 配置项 | 规范 |
|---|---|
| 变更窗口 | 常规:周二/周四 10:00-16:00;紧急:任何时间(需 CTO 审批) |
| 审批流程 | 开发 PR → Code Review → QA 验证 → 运维审批 → 部署 |
| 回滚预案 | 每次变更必须附带回滚方案,回滚时间 < 5min |
| 变更记录 | 所有变更记录到变更管理系统(关联 JIRA Ticket) |
| 变更冻结 | 重大项目交付前 3 天冻结非关键变更 |
10.9.3 密钥轮换
| 密钥类型 | 存储 | 轮换周期 | 方式 |
|---|---|---|---|
| API 签名密钥 | Vault | 90 天 | 自动(Vault rotation) |
| 数据库密码 | Vault | 30 天 | 自动(Vault dynamic secrets) |
| TLS 证书 | cert-manager | 60 天(Let's Encrypt 90 天有效期) | 自动续期 |
| JWT 签名密钥 | Vault | 180 天 | 手动轮换(新旧并行过渡期 7 天) |
| MinIO Access Key | Vault | 90 天 | 自动 |
| 第三方 API Key | Vault | 按服务要求 | 手动 |
10.9.4 容量规划
| 用户规模 | API 服务 Pod | DB (PostgreSQL) | Redis | Kafka | 文件存储 | 月成本估算 |
|---|---|---|---|---|---|---|
| 100 用户 | 2 Pod × 2C4G | 1 主 + 1 备 (4C16G) | 1 × 4G | 1 Broker | 1 TB | ~$2,000 |
| 500 用户 | 4 Pod × 4C8G | 1 主 + 2 备 (8C32G) | 3 × 8G | 3 Broker | 5 TB | ~$8,000 |
| 1000 用户 | 8 Pod × 4C8G | 1 主 + 2 备 (16C64G) | 3 × 16G | 3 Broker | 15 TB | ~$18,000 |
| 5000 用户 | 16 Pod × 8C16G | 1 主 + 3 备 (32C128G) + Citus | 6 × 32G | 6 Broker | 50 TB | ~$60,000 |
注:成本为云服务估算(AWS/阿里云),私有化部署需另行计算硬件采购成本。
11. 时间与计划
11.1 三阶段实施路线图
阶段一:基石构建 (Foundation) — 第 1-4 个月
| 月份 | 目标 | 交付物 |
|---|---|---|
| M1 | 基础架构搭建 | K8s集群、CI/CD流水线、数据库Schema、API框架 |
| M1-2 | 用户与权限系统 | 注册/登录/SSO/RBAC、系统管理后台 |
| M2-3 | 任务管理模块 | 任务CRUD、甘特图、看板、电子表格视图 |
| M2-3 | 文件管理模块 | VFS、命名规范引擎、版本控制、文件锁定 |
| M3-4 | 通讯模块 | 上下文聊天、统一收件箱、通知引擎 |
| M3-4 | 基础DCC插件 | Maya + Nuke 的 NEXUS Panel (My Tasks + Smart Publish) |
| M4 | 集成测试 | 端到端流程打通、性能基准测试 |
里程碑 M1:在一个试点项目中完全替代 Excel 和 FTP
验收标准: - 任务创建到完成的全流程可在系统内闭环 - 文件发布通过 DCC 插件一键完成 - 聊天消息与任务实体关联
阶段二:生态扩展 (Expansion) — 第 5-8 个月
| 月份 | 目标 | 交付物 |
|---|---|---|
| M5 | 审片系统 | Web审片播放器、帧级批注、版本对比、OCIO |
| M5-6 | 流程自动化 | DAG工作流编辑器、门禁系统、事件触发器 |
| M6-7 | 移动端App v1.0 | NEXUS Go (审片模式 + 制片人模式 + 离线支持) |
| M7 | 多地协作 | 分布式缓存架构、智能预取、高速传输 |
| M7-8 | 更多DCC插件 | Houdini、3ds Max、Unreal、Photoshop |
| M8 | RV/Hiero集成 | 播放列表同步、批注同步 |
里程碑 M2:支持跨国多团队协作,移动端活跃度达到 30%
验收标准: - 审片全流程在线完成(含客户门户外部审片) - 上海→成都文件预取延迟 < 30 分钟 - 移动端离线审片→联网同步无数据丢失
阶段三:智能进化 (Intelligence) — 第 9-12 个月
| 月份 | 目标 | 交付物 |
|---|---|---|
| M9-10 | AI剧本拆解 | NLP实体识别、交互校验界面、一键生成 |
| M9-10 | 生成式排期 | 遗传算法引擎、多方案推荐、一键应用 |
| M10-11 | 语义化搜索 | CV标签引擎、向量检索、自然语言搜索 |
| M11 | 统计与BI | 生产仪表盘、财务分析、高管仪表盘 |
| M11-12 | 开发者生态 | GraphQL API、Python SDK 完善、开发者文档 |
| M12 | 全系统优化 | 性能优化、安全加固、文档完善 |
里程碑 M3:实现全自动化排期预警,数据驱动管理覆盖率 100%
验收标准: - AI 剧本拆解准确率 ≥ 85% - 生成式排期 1000 任务规模 5 分钟内出结果 - 语义搜索 Top-10 召回率 ≥ 70% - 所有项目使用 BI 仪表盘进行数据驱动管理
11.2 迭代更新策略
| 发版类型 | 频率 | 内容 |
|---|---|---|
| 热修复 (Hotfix) | 按需(紧急) | 安全漏洞、数据丢失等P0问题 |
| 补丁版 (Patch) | 每 1-2 周 | Bug修复、小优化 |
| 功能版 (Minor) | 每月 | 新功能、功能增强 |
| 大版本 (Major) | 每半年 | 架构升级、重大功能 |
12. 附录
12.1 推荐技术栈详情
12.1.1 前端技术栈
| 层次 | 技术选型 | 选型理由 |
|---|---|---|
| Web框架 | React 18 + TypeScript | 复杂UI生态最丰富,虚拟DOM性能优异 |
| 状态管理 | Zustand | 轻量级,TypeScript友好,适合微服务前端 |
| UI组件库 | Ant Design 5 | 企业级组件齐全,国际化支持好 |
| 构建工具 | Vite 5 | 极速热更新,ESM原生支持 |
| 实时通信 | Socket.IO | WebSocket封装,自动重连/降级 |
| 图表 | ECharts 5 | 图表类型丰富,大数据量性能好 |
| 甘特图 | 基于DHTMLX Gantt定制 | CG场景需要弹性依赖等定制功能 |
| 表格 | AG Grid Enterprise | 百万级行虚拟滚动,公式计算 |
| 3D预览 | Three.js + React Three Fiber | WebGL生态最成熟 |
| 视频播放 | HLS.js + 自研Canvas叠加层 | 帧级批注需要精确帧控制 |
| 样式方案 | Tailwind CSS + CSS Modules | 开发效率高 + 组件隔离 |
12.1.2 桌面端技术栈
| 层次 | 技术选型 | 选型理由 |
|---|---|---|
| 桌面框架 | Tauri 2.0 | Rust核心,内存占用比Electron低50%+,安全性高 |
| DCC插件 | Qt 6 + PySide6 | Maya/Nuke/Houdini原生支持Qt |
| 本地数据库 | SQLite | 轻量级,跨平台,离线缓存 |
| 文件监控 | notify-rs (Rust) | 高性能文件系统事件监听 |
12.1.3 移动端技术栈
| 层次 | 技术选型 | 选型理由 |
|---|---|---|
| 跨平台框架 | Flutter 3 | 自绘UI性能好,审片播放器需要精确帧控制 |
| 状态管理 | Riverpod | 类型安全,依赖注入完善 |
| 本地存储 | Drift (SQLite) + Hive | 结构化数据 + KV存储 |
| 网络层 | Dio + Chopper | REST客户端 + 代码生成 |
| 视频播放 | 自研播放器 (基于ExoPlayer/AVPlayer) | 需要逐帧控制和Canvas叠加 |
12.1.4 后端技术栈
| 层次 | 技术选型 | 选型理由 |
|---|---|---|
| 主服务语言 | Go 1.22 | 高并发、编译快、微服务生态成熟 |
| Web框架 | Gin / Fiber | 高性能HTTP框架 |
| gRPC框架 | 原生grpc-go | 服务间高效通信 |
| AI服务语言 | Python 3.12 | AI/ML生态最丰富 |
| AI框架 | FastAPI + PyTorch + LangChain | 高性能异步API + AI推理 + LLM编排 |
| 实时服务 | Node.js 20 + Socket.IO | WebSocket连接管理成熟 |
| API网关 | Kong | 限流/认证/日志/路由 |
| 消息队列 | Apache Kafka | 高吞吐事件流,持久化 |
| 工作流引擎 | Temporal | 复杂工作流编排,重试/补偿/超时 |
| 任务队列 | Asynq (Go) / Celery (Python) | 异步任务处理 |
12.1.5 数据层技术栈
| 层次 | 技术选型 | 选型理由 |
|---|---|---|
| 主数据库 | PostgreSQL 16 | JSONB自定义字段、全文搜索、分区表 |
| 缓存 | Redis 7 Cluster | 分布式锁、会话管理、热数据缓存 |
| 搜索引擎 | Elasticsearch 8 | 跨实体全文搜索、日志分析 |
| 向量数据库 | Milvus 2.x | 高性能向量检索,支持语义搜索 |
| 对象存储 | MinIO (私有) / S3 / OSS (云) | 兼容S3协议,私有化部署 |
| 时序数据库 | InfluxDB 3 | 监控指标、渲染统计时序数据 |
12.1.6 基础设施技术栈
| 层次 | 技术选型 | 选型理由 |
|---|---|---|
| 容器编排 | Kubernetes 1.29+ | 云原生标准,弹性伸缩 |
| 容器运行时 | containerd | 轻量级,K8s默认运行时 |
| CI/CD | GitLab CI / GitHub Actions | 自动化构建/测试/部署 |
| 基础设施即代码 | Terraform + Helm | 可重复的基础设施部署 |
| 监控 | Prometheus + Grafana | 指标采集 + 可视化 |
| 日志 | Loki + Grafana | 与监控统一平台,成本低于ELK |
| 链路追踪 | Jaeger + OpenTelemetry | 分布式调用链分析 |
| 密钥管理 | HashiCorp Vault | 安全的密钥/证书管理 |
| 身份认证 | Keycloak | 开源SSO/OAuth2.0/SAML |
| 负载均衡 | Nginx Ingress / Envoy | L7负载均衡 + 流量管理 |
12.2 术语表
| 术语 | 全称 | 含义 |
|---|---|---|
| CG | Computer Graphics | 计算机图形学 |
| VFX | Visual Effects | 视觉特效 |
| DCC | Digital Content Creation | 数字内容创作工具(如Maya、Nuke) |
| VFS | Virtual File System | 虚拟文件系统 |
| DAG | Directed Acyclic Graph | 有向无环图 |
| RBAC | Role-Based Access Control | 基于角色的访问控制 |
| ZTNA | Zero Trust Network Access | 零信任网络访问 |
| TPN | Trusted Partner Network | 可信合作伙伴网络(MPAA安全标准) |
| MPAA | Motion Picture Association of America | 美国电影协会 |
| OCIO | OpenColorIO | 开源色彩管理框架 |
| ACES | Academy Color Encoding System | 学院色彩编码系统 |
| SSO | Single Sign-On | 单点登录 |
| MFA | Multi-Factor Authentication | 多因素认证 |
| BI | Business Intelligence | 商业智能 |
| NER | Named Entity Recognition | 命名实体识别 |
| NLP | Natural Language Processing | 自然语言处理 |
| CV | Computer Vision | 计算机视觉 |
| HLS | HTTP Live Streaming | HTTP实时流协议 |
| CDN | Content Delivery Network | 内容分发网络 |
| WAF | Web Application Firewall | Web应用防火墙 |
| RPO | Recovery Point Objective | 恢复点目标 |
| RTO | Recovery Time Objective | 恢复时间目标 |
| TCO | Total Cost of Ownership | 总体拥有成本 |
| LRU | Least Recently Used | 最近最少使用(缓存策略) |
| AOT | Ahead-Of-Time | 预编译 |
| HPA | Horizontal Pod Autoscaler | K8s水平自动扩缩 |
| mTLS | Mutual TLS | 双向TLS认证 |
| PKCE | Proof Key for Code Exchange | OAuth授权码交换证明密钥 |
12.3 参考文档
| 文档 | 说明 |
|---|---|
| 产品策划案(PRD) | 系统原始产品策划案 |
| TPN Best Practices | MPA TPN安全最佳实践指南 |
| OCIO Documentation | OpenColorIO 官方文档 |
| ACES Technical Documentation | ACES 色彩系统技术文档 |
| Kubernetes Documentation | K8s官方文档 |
| PostgreSQL Documentation | PostgreSQL 16 官方文档 |
文档结束
本文档为 系统产品的完整技术说明,涵盖功能需求、界面设计、数据库架构、API规范、性能安全要求、测试部署方案及技术栈选型。文档将随产品迭代持续更新。