业务连续性规划 BCP
应急预案解决"发生了什么",而 BCP 解决"能不能继续运营"——两者的区别在于,BCP 提前量化了每种中断场景对业务的影响,并为每种场景准备了可执行的恢复路径。
BCP 框架(ISO 22301)
graph TD
BIA["业务影响分析 BIA\n哪些流程最关键"] --> RTO["恢复时间目标 RTO\n最多允许中断多久"]
RTO --> RPO["恢复点目标 RPO\n最多允许丢失多少数据"]
RPO --> STRATEGY["恢复策略制定\n备用方案规划"]
STRATEGY --> PLAN["BCP 文档化\n详细恢复步骤"]
PLAN --> TEST["定期演练\n桌面推演+实战"]
TEST --> REVIEW["回顾改进\n更新计划"]
REVIEW --> BIA
style BIA fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
style STRATEGY fill:#c8e6c9,stroke:#388e3c,stroke-width:2px
业务影响分析(BIA)
"""
业务影响分析 BIA 工具
"""
from dataclasses import dataclass
@dataclass
class BusinessProcess:
name: str
category: str # 供应/生产/仓储/物流/IT/财务
revenue_impact_per_day: float # 每天中断损失(元)
regulatory_risk: str # low / medium / high
dependency_systems: list[str]
max_tolerable_downtime_hours: int # 最长可容忍停机时间(小时)
current_rto_hours: int # 当前实际恢复时间(小时)
class BIAAnalyzer:
"""BIA 分析器"""
@staticmethod
def criticality_score(process: BusinessProcess) -> dict:
"""计算关键度评分"""
# 财务影响(0–40分)
daily_loss = process.revenue_impact_per_day
if daily_loss >= 1000000:
financial = 40
elif daily_loss >= 100000:
financial = 30
elif daily_loss >= 10000:
financial = 20
else:
financial = 10
# 监管风险(0–30分)
reg_score = {"low": 10, "medium": 20, "high": 30}
regulatory = reg_score.get(process.regulatory_risk, 10)
# RTO 缺口(0–30分)
rto_gap = max(0, process.current_rto_hours - process.max_tolerable_downtime_hours)
if rto_gap == 0:
gap_score = 30 # 无缺口反而得高分(关键性体现在容忍度低)
gap_score = 10 # 修正:有 RTO 缺口才得分
gap_score = min(30, rto_gap * 3)
total = financial + regulatory + gap_score
return {
"流程": process.name,
"类别": process.category,
"关键度总分": total,
"财务影响分": financial,
"监管风险分": regulatory,
"RTO缺口分": gap_score,
"每日损失": f"¥{process.revenue_impact_per_day:,.0f}",
"容忍停机": f"{process.max_tolerable_downtime_hours}小时",
"当前RTO": f"{process.current_rto_hours}小时",
"RTO缺口": f"{rto_gap}小时",
"优先级": (
"P1 — 立即建立恢复方案" if total >= 70
else "P2 — 3 个月内建立" if total >= 40
else "P3 — 6 个月内建立"
),
}
@classmethod
def analyze_all(
cls, processes: list[BusinessProcess]
) -> list[dict]:
"""全部流程排序"""
results = [cls.criticality_score(p) for p in processes]
return sorted(
results, key=lambda x: x["关键度总分"], reverse=True
)
# 演示
processes = [
BusinessProcess(
"ERP 系统", "IT", 500000, "high",
["数据库", "网络"], 4, 8
),
BusinessProcess(
"主仓库发货", "仓储", 800000, "medium",
["WMS", "ERP"], 8, 12
),
BusinessProcess(
"采购下单", "供应", 200000, "medium",
["ERP", "供应商门户"], 24, 16
),
BusinessProcess(
"财务对账", "财务", 50000, "high",
["ERP", "银行系统"], 48, 24
),
BusinessProcess(
"报表生成", "IT", 10000, "low",
["BI系统"], 72, 4
),
]
print("=== 业务影响分析结果 ===")
for result in BIAAnalyzer.analyze_all(processes):
print(f"\n{result['流程']} [{result['优先级'][:2]}]")
print(f" 关键度: {result['关键度总分']}分 | 每日损失: {result['每日损失']}")
print(f" 容忍: {result['容忍停机']} | 当前RTO: {result['当前RTO']} | 缺口: {result['RTO缺口']}")
BCP 恢复策略矩阵
| 中断场景 | 影响 | 恢复策略 | RTO 目标 |
|---|---|---|---|
| 主仓库火灾 | 仓储能力归零 | 启用备用仓库(预签协议) | 48 小时 |
| ERP 系统崩溃 | 订单处理停止 | 切换灾备系统 | 4 小时 |
| 核心供应商断供 | 生产停线 | 激活备选供应商 | 7–14 天 |
| 主要物流商停运 | 发货停止 | 切换备用物流商 | 24 小时 |
| 数据泄露 | 合规/声誉风险 | 隔离系统,启动应急响应 | 即时 |
| 关键人员突然离职 | 知识断层 | 启动接班人计划,文档化操作 | 1–3 天 |
演练计划
"""
BCP 演练记录
"""
DRILL_TYPES = {
"桌面推演": {
"说明": "纸上演练:讨论各场景下的响应步骤",
"频率": "每季度",
"时长": "2–4 小时",
"参与": "管理层 + 关键岗位",
"输出": "流程漏洞识别、更新行动计划",
},
"功能演练": {
"说明": "部分流程实际切换(如 ERP 切换到灾备)",
"频率": "每半年",
"时长": "半天",
"参与": "IT + 业务骨干",
"输出": "RTO 实测数据、技术缺陷修复",
},
"全场景演练": {
"说明": "模拟完整中断,全员参与恢复",
"频率": "每年",
"时长": "1–2 天",
"参与": "全公司",
"输出": "BCP 有效性验证、全员熟练度提升",
},
}
print("=== BCP 演练体系 ===")
for drill_type, info in DRILL_TYPES.items():
print(f"\n{drill_type}:")
for k, v in info.items():
print(f" {k}: {v}")
行动清单
- [ ] 对公司核心业务流程进行 BIA 评分,确定 P1/P2/P3 优先级
- [ ] 为 P1 级流程(ERP、主仓库)制定详细 BCP 恢复手册(步骤、责任人、联系方式)
- [ ] 与备用仓库/备选物流商预签"应急服务协议"(定价、响应时间约定)
- [ ] 安排每季度桌面推演,验证预案可行性
- [ ] 建立"关键系统数据备份"台账:备份频率、存储位置、恢复测试记录
- [ ] 确认公司是否有网络安全保险,与 BCP 的关联覆盖范围
下一节:03-供应链保险与金融工具 — 用金融工具对冲供应链风险。