Files
cma-management/backend/scripts/seed_knowledge_articles.py

208 lines
7.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""播种知识库文章(P1-3 嵌入用)"""
from app.database import get_session_local
from app.models.knowledge_article import KnowledgeArticle
import logging
logger = logging.getLogger("cma.seed_kb")
def seed_knowledge_articles():
session = get_session_local()()
try:
cnt = session.query(KnowledgeArticle).count()
if cnt > 0:
logger.info(f"知识库文章已存在 {cnt} 条,跳过播种")
return
articles = [
# ── 战略地图画布 ──
KnowledgeArticle(
title="CMA四层因果链",
summary="财务→客户→流程→学习成长的因果驱动关系",
content="""### CMA四层因果链
管理会计OS基于平衡计分卡(BSC)的四层架构:
| 层级 | 说明 | 典型指标 |
|:----|:----|:--------|
| **财务** | 最终结果层,衡量企业价值的实现 | 收入、利润、ROI |
| **客户** | 市场反馈层,反映客户价值的创造 | 满意度、客户数、市场份额 |
| **流程** | 运营效率层,体现运营能力的支撑 | 交付及时率、不良率 |
| **学习** | 基础驱动层,驱动组织能力的成长 | 培训时长、人才梯队 |
**因果链方向**:学习成长 → 内部流程 → 客户 → 财务
**战略地图使用技巧**
- 每个维度设 2-4 个目标
- 每个目标关联 1-2 个 KPI
- 用从下到上的箭头标注驱动关系""",
category="practice",
icon="🗺️",
related_page="/maps/canvas",
sort_order=1,
),
# ── KPI列表 ──
KnowledgeArticle(
title="领先指标 vs 滞后指标",
summary="如何区分和运用领先指标与滞后指标进行管理",
content="""### 领先指标 vs 滞后指标
| 类型 | 定义 | 示例 | 管理用途 |
|:----|:----|:----|:---------|
| **滞后指标** | 衡量结果的历史指标 | 收入、利润、客户数 | 评估过去表现 |
| **领先指标** | 预测未来结果的指标 | 客户接触次数、培训完成率 | 指导当前行动 |
**管理原则**
- 每个滞后指标配套 1-2 个领先指标
- 领先指标的变化先于滞后指标 3-6 个月
- 日常管理聚焦领先指标,月度复盘看滞后指标""",
category="term",
icon="📊",
related_page="/kpis",
sort_order=1,
),
# ── 预算编制 ──
KnowledgeArticle(
title="全面预算编制方法",
summary="从战略到预算的完整编制方法论",
content="""### 全面预算编制方法
**四种主流预算方法**
| 方法 | 适用场景 | 优点 | 缺点 |
|:----|:---------|:----|:-----|
| **增量预算** | 稳定业务 | 简单易行 | 忽略变化 |
| **零基预算** | 转型期 | 资源优化 | 工作量大 |
| **弹性预算** | 波动业务 | 适应性强 | 编制复杂 |
| **滚动预算** | 快速变化 | 持续更新 | 维护成本高 |
**管理会计OS的预算流程**
1. KPI目标值设定 → 2. 预算推算(从KPI自动生成)→ 3. 人工审核调整 → 4. 审批发布 → 5. 执行跟踪""",
category="practice",
icon="💰",
related_page="/budget",
sort_order=1,
),
# ── 差异分析 ──
KnowledgeArticle(
title="弹性预算差异分解",
summary="将总差异分解为价差和量差的系统方法",
content="""### 弹性预算差异分解
弹性预算分析的三步法:
**① 计算总差异**:实际值 - 静态预算值
**② 拆分为量差和价差**
- **量差** = (实际量 - 预算量) × 标准价格
- **价差** = (实际价格 - 标准价格) × 实际量
**③ 判断责任归属**
- 量差 → 销售/生产部门
- 价差 → 采购/定价部门
- 混合差异 → 按比例分摊
**红黄绿灯判定**
| 差异率 | 等级 | 动作 |
|:------|:-----|:-----|
| < 10% | 🟢 正常 | 关注即可 |
| 10%-20% | 🟡 预警 | 分析原因 |
| > 20% | 🔴 异常 | 立即改善 |""",
category="formula",
icon="📐",
related_page="/deviations",
sort_order=1,
),
# ── 预测模拟 ──
KnowledgeArticle(
title="情景分析法",
summary="基于多种假设情景预判财务结果的规划工具",
content="""### 情景分析法
**三种标准情景**
| 情景 | 定义 | 参数设定 |
|:----|:-----|:---------|
| **乐观** | 最优可能结果 | 收入+20%,成本-10% |
| **基准** | 最可能结果 | 按历史趋势外推 |
| **悲观** | 最差可能结果 | 收入-15%,成本+10% |
**使用方法**
1. 确定关键变量(收入、成本、销量)
2. 设置变量的乐观/基准/悲观值
3. 系统自动计算各情景下的财务结果
4. 比较差异,制定风险应对方案
**管理会计OS支持**:CVP分析、投资回报预测、敏感性分析""",
category="term",
icon="🔮",
related_page="/predict",
sort_order=1,
),
# ── 战略回顾会 ──
KnowledgeArticle(
title="战略回顾会最佳实践",
summary="如何高效召开月度战略回顾会的实操指南",
content="""### 战略回顾会最佳实践
**标准议程(60分钟)**
| 序号 | 议程 | 时长 | 准备材料 |
|:---:|:----|:----|:---------|
| 1 | 战略地图状态检查 | 10min | 四层指标达标率 |
| 2 | TOP3偏差讨论 | 20min | 差异分析报告 |
| 3 | 改善行动确认 | 15min | 行动方案清单 |
| 4 | 资源调配决策 | 10min | 预算执行报告 |
| 5 | 会议结论 | 5min | 行动决议 |
**成功要素**
- 会前:系统自动生成数据看板
- 会中:聚焦差异而非全面汇报
- 会后:结论写入改善行动计划
**管理会计OS**:自动拉取差异分析和预警数据,生成议程草稿""",
category="practice",
icon="📋",
related_page="/maps-review",
sort_order=1,
),
# ── 预警中心 ──
KnowledgeArticle(
title="红黄绿灯预警机制详解",
summary="预警规则、阈值设置和响应流程的完整说明",
content="""### 红黄绿灯预警机制
**计算逻辑**:达成率 = 实际值 / 目标值 × 100%
| 达成率 | 颜色 | 含义 | 建议动作 |
|:------|:-----|:-----|:---------|
| ≥ 90% | 🟢 绿灯 | 正常 | 保持 |
| 70%-90% | 🟡 黄灯 | 预警 | 制定改善计划 |
| < 70% | 🔴 红灯 | 异常 | 立即行动 |
**阈值设置建议**
- 正向指标(收入):达成率越高越好
- 反向指标(成本):超额越少越好
- 差异化设定:根据历史数据调整阈值""",
category="term",
icon="⚠️",
related_page="/alerts",
sort_order=1,
),
]
session.add_all(articles)
session.commit()
logger.info(f"已播种 {len(articles)} 条知识库文章")
except Exception as e:
session.rollback()
logger.error(f"知识库文章播种失败: {e}")
raise
finally:
session.close()
if __name__ == "__main__":
seed_knowledge_articles()