系统产品说明文档(Product Specification Document)

文档版本 v2.0(角色视角完善版) 更新日期 2026-02-10 文档密级 内部机密 适用范围 系统全平台(PC Web端 / PC桌面应用端 / 移动端)
变更日志:
版本 日期 变更内容
v1.0 2026-02-10 基于产品策划案创建完整产品说明文档
v2.0 2026-02-10 从 11 类用户角色视角完善功能需求,新增外包/交付模块

目录


1. 概述

1.1 项目背景

计算机图形学(CG)行业涵盖视觉特效(VFX)、长篇动画、游戏开发及虚拟制作等领域,正处于前所未有的转折点。随着流媒体平台对 4K/8K 高分辨率内容的需求爆发,以及 VR/AR 沉浸式体验的普及,制作数据的体量与工艺复杂性呈指数级增长。

行业核心痛点:

痛点维度 现状描述 量化影响
数据摩擦 艺术家依赖 Excel 排期、FTP 传文件、邮件沟通反馈 平均每天 30% 时间用于非创造性劳动
工具割裂 ShotGrid + Dropbox + Slack + Excel 多系统切换 信息碎片化,上下文丢失
协作低效 跨地域团队大文件传输慢、版本不一致 项目延期率高达 40%
决策滞后 缺乏实时数据视图,问题发现时已无法挽回 预算超支平均 15%-25%
安全隐患 缺乏 TPN 级安全管控,泄密风险高 行业每年数起重大泄密事件

市场需求驱动:

1.2 产品目标

系统定位为企业级、云原生的 CG 生产管理操作系统,其核心目标为:

一级目标(核心价值):

  1. 统一生产平台:通过单一平台整合分散的 IT 工具栈(替代 ShotGrid + Dropbox + Slack + Excel),降低总体拥有成本(TCO)40% 以上
  2. 无感化流程:深度集成 DCC 工具(Maya、Nuke、Houdini 等),将文件命名、版本控制、发布流程自动化,让艺术家专注创作
  3. 数据驱动决策:实时数据采集与 AI 分析,提供预测性商业智能(BI),在问题发生前预警

二级目标(用户体验):

  1. 移动化办公:通过 NEXUS Go 移动端 App,让导演和制片人随时随地审片、审批
  2. 智能化升级:AI 驱动的剧本拆解、生成式排期和语义化资产搜索
  3. 全球化协作:支持跨国、跨城市的分布式团队无缝协作

三级目标(商业竞争力):

  1. 安全合规:满足 MPAA/TPN 安全标准,支持完全私有化部署
  2. 开放生态:提供完整的 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 (锁定)

业务规则:

2.2.3 甘特图 2.0 与弹性排期

功能描述: 引入"弹性依赖"机制,解决传统甘特图在频繁变更中的僵化问题。

子功能 描述 交互方式
逻辑链接 支持 FS/SS/FF 及滞后时间(Lag) 拖拽连线建立依赖关系
自动推演 上游延期时自动计算下游连锁影响 "幽灵条(Ghost Bar)"显示预测延期
基线对比 初始计划 vs 实际执行叠加对比 切换"基线视图"按钮
关键路径高亮 自动识别并高亮项目关键路径 颜色标记 + 筛选器
里程碑标记 在时间轴上标记关键交付节点 菱形图标 + 弹窗详情

业务规则:

异常处理:

2.2.4 敏捷看板与电子表格视图

看板视图(Kanban):

电子表格视图(Spreadsheet View):

2.2.5 资源日历视图 (Resource Calendar)

功能描述: 以"人"为维度组织的日历视图,展示每位艺术家的任务排班。制片协调使用此视图识别空闲资源和排期冲突。

子功能 描述 交互方式
人员时间线 纵轴为人员列表,横轴为时间,色块为任务 类似甘特图但按人组织
空闲识别 无任务分配的时间段自动高亮 灰色空白区域
超负荷警告 每日分配超过 8 小时的人员标红 红色高亮 + 警告图标
拖拽指派 将任务拖拽到某人的空闲时段 直接拖拽操作
部门筛选 按部门/技能标签过滤显示 顶部筛选器
多项目叠加 同一人在不同项目的任务以不同颜色显示 颜色图例
请假/不可用 显示人员请假、培训等不可用时段 斜线填充区域

业务规则:

2.2.6 镜头网格视图 (Shot Grid View)

功能描述: 以网格形式展示序列下所有镜头的状态总览,每个格子代表一个镜头的一个环节,颜色代表完成状态。这是视效总监最高频使用的视图。

          Anim    Light   Comp    Final
SH010     ■绿     ■黄     □灰     □灰
SH020     ■绿     ■绿     ■黄     □灰
SH030     ■红     □灰     □灰     □灰
SH040     ■黄     □灰     □灰     □灰
子功能 描述
状态色块 绿=完成、黄=进行中、红=延期/返修、灰=未开始、蓝=审核中
点击查看详情 点击任意色块弹出任务详情/最新版本缩略图
缩略图模式 切换为缩略图网格,每格显示最新版本的缩略图
筛选过滤 按状态、部门、指派人过滤
导出为图片 将网格截图导出为 PNG(用于会议演示)

业务规则:

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 不一致 环境变量自动解析引擎

业务规则:

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/      # 参考资料

业务规则:

2.3.4 版本控制与资产锁定

子功能 描述 交互方式
版本号管理 发布时自动递增版本号 发布面板显示当前版本并自动+1
Check-out/Check-in 二进制文件的并发写入锁定 "编辑"按钮自动锁定,保存后释放
锁定状态显示 被锁定文件显示锁定者信息 锁图标 + 悬浮提示锁定者/时间
依赖关系追踪 记录文件间引用"族谱" 可视化依赖图谱
上游变更通知 被引用文件更新时通知下游 "输入素材已更新"横幅 + 一键更新

业务规则:

异常处理:

2.3.5 版本差异对比工具 (Scene Diff)

功能描述: 艺术家在进行版本迭代时,需要清楚了解两个版本之间的具体差异。系统提供针对 DCC 场景文件的结构化差异对比。

对比类型 支持格式 展示方式
节点树差异 Maya (.ma/.mb), Houdini (.hip) 树形结构标记新增/删除/修改的节点
参数变更 所有 DCC 格式 表格列出变更属性(旧值→新值)
依赖变更 Nuke (.nk), Houdini (.hip) 节点图中高亮变更的连接关系
视觉对比 缩略图/Playblast 分屏/叠化/滑动对比
文件元数据 所有格式 文件大小、引用列表、插件依赖变更

交互描述:

业务规则:

2.3.6 参考资料板 (Reference Board)

功能描述: 为项目/资产/镜头组织视觉参考资料(Mood Board),支持团队共享和讨论。

子功能 描述 交互方式
参考集合创建 创建主题化的参考集合(如"角色服装参考"、"城市夜景参考") 拖拽图片/URL 到画布
多来源导入 支持本地图片、网页截图、URL 链接、系统内已有资产 拖拽 + 粘贴 + 浏览导入
画布标注 在参考图上添加标注说明 画笔/文字/箭头工具
关联实体 将参考集合关联到项目/资产/镜头 实体选择器
团队共享 参考集合可设置为团队可见或个人私有 权限开关
DCC 内查看 在 DCC 插件面板中浏览当前任务关联的参考 NEXUS Panel 内嵌查看

业务规则:

2.3.7 创意方向板 (Creative Brief)

功能描述: 为项目/场次/资产设定视觉风格指引和创意方向文档,由导演或视效总监创建,团队成员可引用作为制作依据。

子功能 描述
风格指引 Mood Board 画板(色彩调性、光影风格、参考影片截图)
文字简报 创意方向的文字说明(支持富文本)
色彩方向 主色调参考板 + 色彩范围指引
分层级指引 项目级(整体风格)→ 序列级(场景氛围)→ 资产级(角色设计)
版本追踪 创意方向的变更历史,旧版本保留可追溯
团队通知 创意方向更新时自动通知相关团队成员

业务规则:

2.3.8 结构化反馈表单 (Structured Feedback)

功能描述: 除了自由绘制的帧级批注外,提供结构化的反馈选项模板,降低沟通歧义,特别适用于客户反馈场景。

反馈维度 选项示例
动画节奏 太快 / 合适 / 太慢
色彩倾向 偏暖 / 合适 / 偏冷
动作幅度 太大 / 合适 / 太小
整体评价 通过 / 小修改后通过 / 需要返修 / 重做
优先级 必须修改 / 建议修改 / 可忽略

交互描述:

2.4 核心模块三:流程自动化 (Workflow Automation)

2.4.1 功能描述

负责连接各个功能孤岛,实现数据的自动流转。系统提供可视化的 DAG(有向无环图)工作流引擎和事件触发器。

2.4.2 DAG 工作流引擎

可视化节点编辑器:

门禁类型 检查内容 触发时机
几何体检查 非流形几何体、翻转法线、孤立顶点 模型发布到绑定前
命名规范检查 节点/材质命名是否符合规范 任何发布操作前
帧数检查 动画帧范围是否匹配镜头设定 动画发布前
分辨率检查 渲染输出分辨率是否正确 灯光/合成发布前
自定义脚本 Pipeline TD 编写的自定义验证 可配置

交互描述:

业务规则:

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. 推送汇总邮件给制片人

自定义触发器:

异常处理:

2.4.4 沙盒/测试环境 (Sandbox)

功能描述: 为 Pipeline TD 提供与生产环境隔离的沙盒环境,用于开发和测试新的工作流配置、门禁脚本和触发器。

子功能 描述
沙盒项目 创建独立的沙盒项目,包含模拟数据
配置克隆 从生产项目复制工作流/触发器/命名规范到沙盒
安全执行 沙盒中的触发器不会发送真实通知或修改生产数据
日志与调试 增强的调试日志(变量值、执行路径、性能计时)
一键发布 测试通过后将配置从沙盒发布到生产环境(需审批)

业务规则:

2.4.5 工作流文档自动生成

功能描述: TD 配置好 DAG 工作流后,系统自动生成面向艺术家的可视化操作指南文档。

输出内容 描述
流程图 自动生成工作流的可视化流程图(SVG/PNG)
步骤说明 每个环节的操作说明(发布规范、输入输出要求)
门禁清单 每个环节需要通过的检查项列表
状态说明 各状态的含义和流转规则
输出格式 可导出为 PDF / HTML / 在线知识库页面

2.5 核心模块四:通讯与协作 (Communication)

2.5.1 功能描述

解决"信息碎片化"问题,确保所有沟通发生在具体的"上下文"中,消除跨工具切换的信息损耗。

2.5.2 上下文感知聊天 (Context-Aware Chat)

子功能 描述 交互方式
实体频道 每个项目/场次/镜头/资产自动拥有专属聊天频道 左侧树形导航进入对应频道
深度链接 聊天中引用系统内任何实体 输入 # 搜索任务,@ 提及用户
富文本消息 支持 Markdown、代码块、表格 编辑器工具栏
文件分享 直接在聊天中分享文件版本 拖拽文件或点击附件按钮
消息回复/线程 支持针对特定消息回复,形成讨论线程 悬浮菜单点击"回复"
消息置顶 重要消息置顶显示 管理员/频道主可操作

业务规则:

2.5.3 统一收件箱 (Action Center)

聚合所有来源的消息并按优先级智能排序:

消息类型 来源 优先级
@提醒 同事在聊天/批注中提及
审批请求 流程模块触发
任务状态变更 自己关注的任务有更新
系统通知 渲染完成、文件发布、空间预警
每日汇总 系统自动生成

交互描述:

2.6 核心模块五:统计与商业智能 (Statistics & BI)

2.6.1 功能描述

挖掘生产过程海量数据,为决策者提供可视化支持与预测性分析。

2.6.2 生产效能仪表盘

图表类型 用途 数据源
燃尽图 (Burndown) 剩余任务量 vs 剩余时间 任务状态变更记录
速率图 (Velocity) 团队每周完成任务量趋势 任务完成时间戳
配额追踪 (Quota) 实际产出 vs 目标配额 工时记录 + 任务完成数
部门负载热力图 各部门当前任务负载 任务分配数据
资源利用率 艺术家工时利用率 Timesheet 数据

业务规则:

2.6.3 财务与工时分析

子功能 描述 输出
Bid vs Actual 报价单数据与实际工时对比 按镜头/场次/部门维度的毛利损耗报表
超支预警 资产制作时长超平均值 150% 时预警 自动通知制片人
Timesheet 艺术家每日工时填写 工时汇总报表
成本归集 按项目/镜头/资产归集人工成本 项目成本明细表

业务规则:

2.6.4 个人效能面板 (My Performance)

功能描述: 面向艺术家的个人工作数据看板,帮助自我管理和成长追踪。每位用户仅可查看自己的数据。

指标 描述 展示方式
本周/本月完成任务数 已完成任务的数量趋势 折线图 + 与上周对比
返修率 (Retake Rate) Retake 次数 / 总审批次数 百分比 + 趋势
平均完成用时 每个任务从开始到完成的平均天数 按部门/任务类型细分
工时填写完整度 Timesheet 填写天数 / 工作日天数 进度条
技能标签进展 个人技能标签的成长记录 雷达图
个人里程碑 自定义的个人目标追踪 清单 + 完成状态

业务规则:

2.6.5 自动日报/周报生成 (Auto Report)

功能描述: 系统根据当日/当周的任务状态变更、审片结果、工时数据,自动生成结构化的生产报告,减少制片协调手动整理的时间。

报告类型 内容 生成频率 接收人
每日生产日报 (DPR) 今日完成任务、新增返修、阻塞问题、明日计划 每日下班时自动生成 制片协调、制片人
周报 本周完成/计划对比、里程碑进展、超时任务、资源利用率 每周五自动生成 制片人、Supervisor
里程碑报告 里程碑达成情况、剩余工作量、风险预警 里程碑前 3 天 制片人、高管
项目月报 预算消耗、进度偏差、质量指标(返修率)、资源统计 每月初自动生成 高管、制片人

交互描述:

业务规则:

2.6.6 高管经营仪表盘 (Executive Dashboard)

功能描述: 专为工作室高管设计的战略级数据视图,聚焦经营指标和产能分析。

指标分类 具体指标 数据来源
财务概览 季度/年度营收趋势、项目利润率分布、应收账款 报价管理 + 工时数据
产能分析 各部门负载率、闲置资源、未来 3 月产能预测 任务排期 + 人员数据
项目健康度 在运行项目数、延期/超支项目占比、客户满意度 任务/BI/客户反馈
人力资源 团队规模趋势、部门人数分布、技能分布热力图 用户管理 + 技能档案
业务发展 竞标中标率、报价准确性、新客户获取率 报价管理
质量指标 全工作室平均返修率、一次通过率 审片数据

交互描述:

业务规则:

2.6.7 多项目组合视图 (Portfolio View)

功能描述: 面向管理多个项目的制片人,提供跨项目的全局概览和对比分析。

子功能 描述
项目健康度矩阵 所有在运行项目的进度/预算/质量三维评分,颜色标识健康状态
跨项目资源视图 查看同一个艺术家在不同项目间的时间分配
里程碑时间线 所有项目的关键里程碑在同一时间线上展示
预算汇总 所有项目的预算消耗汇总与剩余预算
风险热力图 跨项目的风险分布概览

2.6.8 报价与竞标管理 (Bidding Management)

功能描述: 管理项目竞标全流程,从镜头复杂度评估到报价单生成,为 Bid vs Actual 分析提供完整的数据源。

子功能 描述 操作角色
镜头复杂度评估 对每个镜头/资产标记复杂度等级(简单/中等/复杂/极复杂) Supervisor
工时估算模板 按部门/复杂度配置标准工时模板(如"复杂角色模型=15人天") Producer
报价单生成 基于评估结果自动生成报价单,支持手动调整 Producer
版本管理 报价单支持多版本(初版/修订版),保留完整历史 Producer
报价对比 同一项目的不同报价版本横向对比 Producer
导出 导出为 PDF/Excel 格式的正式报价文档 Producer

业务规则:

2.6.9 变更管理 (Change Order Management)

功能描述: 当客户在项目进行中提出需求变更时,管理变更请求的评估、审批和预算追踪。

变更流程阶段 描述 操作角色
变更提交 客户通过客户门户或制片人手动录入变更请求 Client / Producer
影响评估 Supervisor 评估变更对工期/成本的影响 Supervisor
费用重估 基于影响评估生成追加报价 Producer
审批 内部审批(Producer/高管)+ 客户确认 Producer / Client
执行 审批通过后自动创建新任务并调整排期 系统自动
追踪 变更产生的额外成本单独归集追踪 Producer

业务规则:

2.6.10 风险登记册 (Risk Register)

功能描述: 除系统自动预警外,制片人手动记录和追踪项目风险,评估影响和制定应对措施。

风险属性 描述
风险描述 自由文本描述风险内容
风险类别 进度/预算/人员/技术/外部
影响程度 低/中/高/极高
发生概率 低/中/高
风险等级 自动计算(影响 x 概率)
应对措施 描述应对策略和负责人
状态 开放/监控中/已缓解/已关闭
关联实体 关联到具体项目/任务/人员

业务规则:

2.6.11 项目复盘工具 (Post-Mortem)

功能描述: 项目结束后的复盘工具,自动汇总项目全周期数据并提供结构化的经验教训记录。

自动汇总数据 描述
进度偏差 原始计划 vs 实际完成的时间对比
预算偏差 报价金额 vs 实际成本
返修率统计 按部门/环节的返修率分布
资源效率 实际人效 vs 历史基准
变更统计 变更次数、变更金额占比
交付质量 客户反馈汇总、一次通过率

人工输入内容:

复盘模块 描述
做得好 (What went well) 团队投票 + 自由描述
待改进 (What to improve) 团队投票 + 自由描述
行动计划 (Action items) 具体改进措施和负责人
经验沉淀 可复用的流程改进写入知识库

业务规则:

2.6.12 客户沟通记录 (Client Communication Log)

功能描述: 管理与外部客户的沟通记录,确保重要决策和反馈不丢失。

子功能 描述
会议纪要 记录每次客户会议的讨论内容和决策结果
决策追踪 标记关键决策(如"客户确认角色外形方案A"),可追溯
邮件存档 关键邮件手动存档到项目记录中
沟通时间线 按时间轴展示所有客户沟通记录
关联实体 将沟通记录关联到具体镜头/资产/变更请求

业务规则:

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 路径模板

业务规则:

Smart Publish 自动执行流程:

场景清理 → 缩略图截取 → Playblast 生成 → 门禁检查 → 版本号递增 
→ 文件上传 → 数据库记录更新 → 状态变更 → 通知下游

业务规则:

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 插件版本的兼容性
环境诊断 艺术家工作站环境一键检查,发现不一致自动修复

业务规则:

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 代理)

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 标准实现

交互描述:

业务规则:

2.8.3 Dailies 会议模式

功能描述: 专为每日审片会 (Dailies) 设计的会议工具,将审片组织、实时反馈和会后纪要自动化。

子功能 描述 交互方式
会议创建 选择日期/时间/参会人/播放列表 表单创建 + 日历集成
自动播放列表 自动收集当天所有"Pending Review"状态的版本 一键生成今日播放列表
会议模式播放 全屏播放 + 实时批注面板 主持人控制播放进度
实时投票 参会人对每个版本实时投 Approve/Retake 快捷按钮
语音转文字 会议讨论实时语音转录为文字记录 麦克风按钮开启
会议纪要自动生成 会后自动汇总所有批注和投票结果 按镜头分类的结构化报告
纪要分发 将反馈自动推送到对应艺术家的任务 一键分发 + 自动创建返修任务

业务规则:

2.8.4 LookDev 审批模式

功能描述: 针对 Look Development 的专业审批工具,支持多角度、多光照条件的资产外观审查。

子功能 描述
转盘展示 360度旋转展示(支持交互拖拽旋转或自动播放)
多光照对比 同一资产在不同 HDRI 环境光下的并排对比
灰球/色球参考 自动在画面中显示灰球和色球用于色彩校准
材质细节放大 支持局部放大查看材质纹理细节(无损缩放)
变体对比 同一资产不同变体(如干净版/脏旧版)并排对比
与参考图对比 将 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 确保传输完整性
带宽调度 支持设置传输优先级和带宽限制
压缩传输 文件传输前自动压缩(可配置)

业务规则:

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

业务规则:

2.10.3 供应商库管理

子功能 描述
供应商档案 公司信息、联系人、擅长领域、历史评分
历史合作记录 过往外包项目的质量评分、交付及时率
供应商评分 基于交付质量、及时性、返修率的自动评分
合同管理 保密协议 (NDA)、服务协议的上传和有效期追踪

2.11 核心模块十:交付管理 (Delivery Management)

2.11.1 功能描述

管理 CG 制作最终交付物的全生命周期,从交付规范定义到客户验收签收。

2.11.2 交付流程

阶段 功能 描述
规范定义 交付规范模板 定义交付格式(DPX/EXR/ProRes)、分辨率、色彩空间、文件命名等
交付打包 自动打包工具 根据规范自动收集和转码最终版本文件
质量检查 交付检查清单 自动验证:分辨率、帧数、色彩空间、文件完整性
客户预览 客户门户预览 客户在门户中预览交付物(带水印)
客户审批 签收确认 客户在门户中逐镜头确认接收
正式交付 文件传输 通过高速传输通道或物理介质交付无水印源文件
版本管理 交付版本历史 记录每次交付的版本、日期、客户反馈

业务规则:

2.12 扩展能力一:移动端 NEXUS Go

2.10.1 功能描述

将导演、制片人和总监从工位解放,利用碎片化时间进行决策。根据用户角色自动切换界面模式。

2.10.2 导演/总监模式 (Review Mode)

子功能 描述 交互方式
每日样片流 类似短视频应用的沉浸式刷片体验 上下滑动切换版本
触控批注 充分利用触控特性 手指/Apple Pencil 直接在画面上绘制
语音+画笔 混合输入,语音自动转文字 按住麦克风按钮边说边画
离线审片 登机模式,有网时自动同步 下载播放列表 → 离线批注 → 联网同步
快速审批 滑动手势快速 Approve/Retake 右滑通过,左滑返修
现场参考采集 在拍摄现场快速拍照/录像并上传为参考 相机按钮 → 拍摄 → 选择关联镜头/资产 → 上传
创意方向浏览 查看当前项目/序列的创意方向板 参考图集浏览 + 标注查看

2.12.3 制片人模式 (Producer Mode)

子功能 描述 交互方式
项目脉搏 实时动态流,今日完成数、即将到期里程碑 下拉刷新
一键审批 处理审批请求(加班/外包费用等) 滑动或点击审批按钮
关键指标 燃尽图、资源利用率等核心数据 图表卡片式展示
通讯录 项目组通讯录 一键拨号/唤起微信/钉钉
推送通知 关键事件实时推送 系统级推送通知

业务规则:

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) 标签

交互描述:

业务规则:

2.11.2 生成式排期 (Generative Scheduling)

功能描述: 利用遗传算法解决资源冲突与排期优化的 NP-hard 难题。

输入约束:

输出方案:

方案 描述 风险评估
激进方案 最早完工,需要 20% 加班 风险高,成本高
平衡方案 按时完工,资源利用率最优 推荐方案
保守方案 延期一周,无需加班 风险低,成本最低

业务规则:

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 条搜索记录
保存筛选器 保存常用搜索条件为"快捷筛选"
权限过滤 搜索结果自动过滤无权限的实体
模糊匹配 支持拼写纠错和同义词匹配

交互描述:

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等),带下载权限控制和审计日志
项目进度概览 客户可见的简化版项目进度视图:里程碑完成状态、整体完成百分比(不涉及内部细节)
审批历史追踪 客户查看自己的反馈历史:哪些批注已被执行、哪些在处理中、哪些被标记为已解决
变更请求提交 客户正式提交需求变更请求(关联到具体镜头/资产),进入变更管理流程
审片会议预约 客户在线预约审片会议时间,与制片人日历联动
账单查看 查看项目合同概要、付款进度、发票状态(可选开放)
多语言界面 客户门户独立支持多语言(中/英/日),不受内部系统语言设置影响

业务规则:

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人...)

业务规则:

2.12.16 Showreel/作品集管理

功能描述: 管理工作室对外展示的作品集和 Showreel,从已交付项目中筛选精华镜头生成展示视频。

子功能 描述
精选库 从已交付项目中标记"精选"镜头/资产
Showreel 编辑 将精选片段按顺序编排,定义转场和配乐
版本管理 Showreel 的版本历史
客户授权 记录每个镜头的对外展示授权状态(部分项目有保密协议不可公开)
多格式输出 导出为不同格式/分辨率(网站用/演示用/社交媒体用)
嵌入代码 生成可嵌入到公司网站的播放器代码

业务规则:

2.12.17 技能档案与成长追踪

功能描述: 为每位艺术家维护技能档案,支持技能标签匹配和个人成长路径追踪。

子功能 描述
技能标签 为用户标记技能标签(建模、绑定、动画、灯光等)及熟练程度(初级/中级/高级/专家)
技能评估 Supervisor 定期评估并更新艺术家技能等级
成长记录 记录技能等级变更历史、培训参与、优秀作品
技能匹配 任务分配时自动推荐技能匹配的艺术家
团队技能图谱 团队维度的技能分布雷达图(用于识别技能短板)

业务规则:

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 与桌面应用通信     │
└─────────────────────────────────────────┘

本地数据库同步策略:

阶段 流程 说明
首次登录 全量拉取 拉取用户所属项目的任务/文件元数据,写入 SQLite
正常在线 WebSocket 推送 收到变更事件后,调用 /sync/delta 拉取增量写入 SQLite
定时兜底 30s 轮询 防止 WS 丢消息,每 30s 调用 delta 补偿
离线恢复 增量同步 重新连网后,以 last_sync_cursor 为起点拉取全部增量
冲突处理 乐观锁 本地修改与服务端冲突时弹窗提示用户选择(保留本地/采用服务端/合并)

SQLite Schema 版本管理:使用 Rust rusqliteuser_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

组件设计规则:

3.6.2 状态管理规范

状态分层:

状态类型 管理方式 示例
服务端状态 React Query (TanStack Query) 任务列表、项目数据、审片记录
客户端全局状态 Zustand 当前用户、主题偏好、侧边栏展开
客户端局部状态 React useState/useReducer 表单输入、弹窗开关、临时筛选
URL 状态 React Router searchParams 分页、排序、筛选条件
实时状态 WebSocket + Zustand 在线用户、实时通知、任务状态变更

Zustand Store 拆分原则:

React Query 规范:

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);
  /* ... */
}

切换与持久化:

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 图表 后端预聚合,前端仅渲染摘要数据 始终

加载状态规范:

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 集成):

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-viewfix/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 数据同步一致性

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 冲突解决用户流程

冲突检测时机:

冲突类型与处理:

冲突类型 自动处理 人工干预
不同字段修改 自动合并(字段级 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):单库 + 逻辑隔离

演进计划(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 专用副本 重查询隔离,不影响在线业务

主从延迟监控:

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 条使用 COPYunnest() 替代逐条 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 日

归档策略:

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';

安全审计:

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: 30X-RateLimit-Limit: 100X-RateLimit-Remaining: 0X-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权限检查 → 业务逻辑

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压缩后首包

优化策略:

6.2 PC 桌面应用端

指标 目标值 测量条件
应用启动时间 ≤ 3s 冷启动(SSD)
内存占用(空闲) ≤ 200MB 无项目打开
内存占用(工作中) ≤ 800MB 打开一个项目
DCC插件加载 ≤ 2s Maya/Nuke内加载面板
文件上传速度 ≥ 局域网80%带宽 本地NAS
文件下载速度 ≥ 局域网80%带宽 本地NAS
本地缓存大小 可配置(默认50GB) 自动管理
离线模式切换 ≤ 1s 网络断开检测到UI切换

优化策略:

6.3 移动端

指标 目标值 测量条件
App 启动时间(冷启动) ≤ 2s iPhone 12 / 中端Android
App 启动时间(热启动) ≤ 500ms 后台切回
内存占用 ≤ 150MB 正常使用
审片视频加载 ≤ 3s 4G网络,1080p
页面切换动画 60fps 流畅无卡顿
电池消耗 ≤ 5%/h 正常使用(非视频播放)
离线数据包大小 ≤ 500MB 单项目
推送通知到达 ≤ 5s APNs/FCM
安装包大小 ≤ 80MB 首次下载

优化策略:

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)

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

实现方式:

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仓库 + 自动更新

自动更新机制:

10.4 移动端部署

平台 分发渠道 审核周期
iOS App Store + 企业证书(In-House) 1-3工作日
Android Google Play + 企业内网APK 即时(内网) / 1天(Play)
iPadOS App Store (通用应用) 同iOS

热更新策略:

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 新功能通过开关控制灰度百分比 渐进式功能开放

金丝雀发布自动化指标:

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规范、性能安全要求、测试部署方案及技术栈选型。文档将随产品迭代持续更新。