diff --git a/backend/app/api/okr_templates.py b/backend/app/api/okr_templates.py index a15e4325..21637a9e 100644 --- a/backend/app/api/okr_templates.py +++ b/backend/app/api/okr_templates.py @@ -68,6 +68,7 @@ def list_okr_templates( "industry_tag": t.industry_tag, "preset_krs": t.preset_krs, "source": t.source, + "owner": t.owner, "use_count": t.use_count, "sort_order": t.sort_order, "is_active": t.is_active, @@ -93,6 +94,7 @@ def get_okr_template(template_id: int, db: Session = Depends(get_db)): "industry_tag": t.industry_tag, "preset_krs": t.preset_krs, "source": t.source, + "owner": t.owner, "use_count": t.use_count, "sort_order": t.sort_order, "is_active": t.is_active, @@ -101,7 +103,7 @@ def get_okr_template(template_id: int, db: Session = Depends(get_db)): @router.post("") def create_okr_template(data: dict, db: Session = Depends(get_db)): - """用户自定义 OKR 模板""" + """用户自定义 OKR 模板(治理: 同名去重 + owner 标记)""" name = data.get("name", "").strip() if not name: raise HTTPException(400, "模板名称不能为空") @@ -111,6 +113,14 @@ def create_okr_template(data: dict, db: Session = Depends(get_db)): preset_krs = data.get("preset_krs", []) if not isinstance(preset_krs, list) or len(preset_krs) == 0: raise HTTPException(400, "至少需要一个预设KR") + # P2治理: 同名+同维度去重(防止 id=33 式重复模板,2026-08-21) + dup = db.query(OKRTemplate).filter( + OKRTemplate.name == name, + OKRTemplate.dimension == dimension, + OKRTemplate.is_active == 1, + ).first() + if dup: + raise HTTPException(409, f"已存在同名模板「{name}」(#{dup.id}, source={dup.source}),请改用现有模板或改名") t = OKRTemplate( name=name, @@ -120,6 +130,7 @@ def create_okr_template(data: dict, db: Session = Depends(get_db)): industry_tag=data.get("industry_tag", "general"), preset_krs=preset_krs, source="user", + owner="用户自定义", sort_order=data.get("sort_order", 0), ) db.add(t) @@ -164,6 +175,8 @@ def apply_okr_template(template_id: int, data: dict, db: Session = Depends(get_d "name": kr.get("name", ""), "target_value": kr.get("target_value", ""), "weight": kr.get("weight", 33), + "metric_kpi_id": kr.get("metric_kpi_id"), + "metric_kpi_code": kr.get("metric_kpi_code"), } for kr in preset_krs ], diff --git a/backend/app/models/__init__.py b/backend/app/models/__init__.py index 81447ba8..407fcac3 100644 --- a/backend/app/models/__init__.py +++ b/backend/app/models/__init__.py @@ -410,6 +410,7 @@ class OKRTemplate(Base): industry_tag = Column(String(50), default="general", comment="行业标签") preset_krs = Column(JSON, nullable=False, comment="预设关键结果列表") source = Column(String(20), default="system", comment="system/user/industry_pack") + owner = Column(String(50), default="CMA标准库", comment="模板负责人(治理P2: 可追踪)") use_count = Column(Integer, default=0, comment="使用次数") sort_order = Column(Integer, default=0) is_active = Column(Integer, default=1) diff --git a/docs/kpi-dictionary-gap-list.md b/docs/kpi-dictionary-gap-list.md new file mode 100644 index 00000000..f7329dc7 --- /dev/null +++ b/docs/kpi-dictionary-gap-list.md @@ -0,0 +1,58 @@ +# KPI 字典缺口清单(OKR 模板 KR 未匹配项) + +> 生成:2026-08-21 | 来源:OKR模板库 DAMA 检查 P1(33条KR无法映射到KPI字典) + +> 意义:OKR 模板引用的 KR 在 `kpi_definitions` 中无对应指标 → 追溯链断裂,需补 KPI 定义 + + +共 **33** 条缺口,涉及 **22** 个模板 + +| # | 模板 | 行业 | 缺口KR | 目标值 | 建议补充KPI | 优先级 | +|:-:|:--|:--|:--|:--|:--|:--:| +| 1 | #1 扩大收入规模 | 通用 | 新客户收入占比≥15% | ≥15% | P_NEW_PROD_RATIO类: C_NEW_CLIENTS×客单价(新增复合KPI) | P1 | +| 2 | #1 扩大收入规模 | 通用 | 客单价提升≥10% | ≥10% | F_REVENUE/C_NEW_CLIENTS 派生: 客单价=营收/客户数(建议新增 ARPU) | P1 | +| 3 | #5 产品领先 | 通用 | 产品合格率≥99% | ≥99% | 建议新增 P_QUALITY_RATE(制造/服务交付质量) | P1 | +| 4 | #7 卓越运营 | 通用 | 价格竞争力行业TOP3 | TOP3 | 定性指标(建议 C_MARKET_SHARE 替代或新增竞争力评分) | P1 | +| 5 | #9 客户管理有序 | 通用 | 客户线索转化率≥20% | ≥20% | 建议新增 P_LEAD_CONVERSION(销售漏斗) | P1 | +| 6 | #11 合规稳健运营 | 通用 | 审计通过率100% | 100% | 建议新增 P_AUDIT_PASS_RATE(内审合规) | P1 | +| 7 | #13 数字系统赋能 | 通用 | 报表自动生成率≥80% | ≥80% | 建议新增 L_REPORT_AUTO_RATE(数字化效率) | P1 | +| 8 | #14 组织协同对齐 | 通用 | 跨部门协作评分≥4分 | ≥4分 | 定性指标(建议 L_EMPLOYEE_SAT 拆分子项) | P1 | +| 9 | #15 优化渠补结构 | 贸易 | 渠补成本下降≥20% | ≥20% | F_COST_RATIO 子项或新增 C_REBATE_COST(渠补费用) | P1 | +| 10 | #16 加速应收周转 | 贸易 | 逾期账款占比≤5% | ≤5% | F_AR_DAYS 补充: 建议新增 F_OVERDUE_RATIO | P1 | +| 11 | #17 建立渠道分级体系 | 贸易 | 渠道分级覆盖率100% | 100% | 建议新增 P_CHANNEL_TIER_COVERAGE | P1 | +| 12 | #17 建立渠道分级体系 | 贸易 | A级渠道占比≥30% | ≥30% | 建议新增 P_CHANNEL_A_RATIO | P1 | +| 13 | #19 建立渠补谈判SOP | 贸易 | 渠补谈判SOP覆盖率100% | 100% | 建议新增 P_SOP_COVERAGE(流程标准化) | P1 | +| 14 | #19 建立渠补谈判SOP | 贸易 | 谈判周期缩短≥30% | ≥30% | 建议新增 P_NEGOTIATION_CYCLE | P1 | +| 15 | #19 建立渠补谈判SOP | 贸易 | 渠补争议事件≤3起/季 | ≤3起/季 | 建议新增 P_REBATE_DISPUTE(风险管理) | P1 | +| 16 | #20 进销存系统全覆盖 | 贸易 | 进销存报表自动生成率≥80% | ≥80% | L_REPORT_AUTO_RATE(同报表自动化) | P1 | +| 17 | #21 渠道赋能培训 | 贸易 | 培训后渠道业绩提升≥10% | ≥10% | F_REVENUE_GROWTH 复合(培训ROI) | P1 | +| 18 | #22 提升人均产值 | IT服务 | 人效同比增长≥15% | ≥15% | 建议新增 L_PRODUCTIVITY(人均产值同比) | P1 | +| 19 | #24 交付标准化 | IT服务 | 交付SOP覆盖率100% | 100% | P_SOP_COVERAGE(流程标准化) | P1 | +| 20 | #24 交付标准化 | IT服务 | 项目验收一次通过率≥85% | ≥85% | 建议新增 P_ACCEPTANCE_RATE(项目交付质量) | P1 | +| 21 | #26 工程师认证体系 | IT服务 | 高级工程师占比≥30% | ≥30% | 建议新增 L_SENIOR_RATIO(人才结构) | P1 | +| 22 | #27 提升产能利用率 | 制造 | 产能利用率≥85% | ≥85% | 建议新增 P_CAPACITY_UTIL(制造业核心) | P2 | +| 23 | #27 提升产能利用率 | 制造 | 设备停机时间下降≥20% | ≥20% | 建议新增 P_EQUIPMENT_DOWNTIME(OEE组成) | P2 | +| 24 | #27 提升产能利用率 | 制造 | OEE综合效率≥75% | ≥75% | 建议新增 P_OEE(制造业核心) | P2 | +| 25 | #28 降低生产成本 | 制造 | 单位制造成本下降≥10% | ≥10% | 建议新增 F_UNIT_COST(制造业成本) | P2 | +| 26 | #28 降低生产成本 | 制造 | 原材料损耗率≤2% | ≤2% | 建议新增 P_MATERIAL_WASTE(制造质量) | P2 | +| 27 | #28 降低生产成本 | 制造 | 采购成本下降≥5% | ≥5% | 建议新增 F_PROCUREMENT_COST(供应链) | P2 | +| 28 | #29 提升产品一次合格率 | 制造 | 一次合格率≥98% | ≥98% | P_QUALITY_RATE(同产品合格率) | P2 | +| 29 | #29 提升产品一次合格率 | 制造 | 质量返工成本下降≥20% | ≥20% | 建议新增 P_REWORK_COST(质量成本) | P2 | +| 30 | #30 缩短交付周期 | 制造 | 在制品库存下降≥20% | ≥20% | 建议新增 P_WIP_INVENTORY(制造库存) | P2 | +| 31 | #31 设备智能化升级 | 制造 | 数据采集点覆盖关键工序100% | 100% | L_SYS_COVERAGE 子项 | P2 | +| 32 | #32 安全生产零事故 | 制造 | 重大安全事故0起 | 0起 | 建议新增 P_SAFETY_INCIDENT(EHS) | P2 | +| 33 | #32 安全生产零事故 | 制造 | 安全隐患整改率100% | 100% | 建议新增 P_SAFETY_RECTIFY(EHS) | P2 | + +## 按行业聚类建议 + +- **制造**: 12 条缺口 +- **贸易**: 9 条缺口 +- **通用**: 8 条缺口 +- **IT服务**: 4 条缺口 + +## 补充建议 + +1. **制造业(P2)**:新增 P_CAPACITY_UTIL / P_OEE / F_UNIT_COST / P_MATERIAL_WASTE / P_WIP_INVENTORY / P_SAFETY_INCIDENT 等 6+ 指标,可让 manufacturing 行业包 6 个模板全部闭环 +2. **贸易(P1)**:新增 P_CHANNEL_TIER_COVERAGE / P_SOP_COVERAGE / F_OVERDUE_RATIO 等,trading 包 7 个模板闭环 +3. **通用/IT服务(P1)**:新增 P_LEAD_CONVERSION / P_ACCEPTANCE_RATE / L_PRODUCTIVITY / ARPU 客单价等 +4. 补充后 33 条缺口预计可闭环 25+ 条,剩余定性指标(价格竞争力/跨部门协作)建议用评分型KPI或定性评估 diff --git a/docs/okr-template-calibration.md b/docs/okr-template-calibration.md new file mode 100644 index 00000000..fddf1bbe --- /dev/null +++ b/docs/okr-template-calibration.md @@ -0,0 +1,56 @@ +# OKR 模板目标值校准建议(酣客 / 博海) + +> 生成:2026-08-21 | 依据:DAMA 检查 P2-2 + CMA目标值校准方法论(cma-theory-audit 第七部分) +> 原则:先落地后理想(首年目标≈实际值±20%,跳一跳够得着);反向指标逐步收紧;行业差异优先 + +## 实体特征基线 + +| 特征 | 酣客(白酒经销/贸易) | 博海(IT服务) | +|:--|:--|:--| +| 月营收 | ~100万(年1200万) | ~200万(年2500万) | +| 毛利率 | 18.6% | 13.1% | +| 渠补率 | 82.8%(极高) | 0%(无渠道依赖) | +| 现金比率 | 0.6%(断流风险) | 6.7%(紧张) | +| 费用增速/收入增速 | 2.2倍(失控) | 0.8倍(健康) | +| 管理费/净收入 | 447%(4.5倍·极度低效) | 1.4%(健康) | + +## 通用模板(level1)校准表 + +| 模板 | KR | 模板默认 | 酣客建议 | 博海建议 | 理由 | +|:--|:--|:--:|:--:|:--:|:--| +| 扩大收入规模 | 营收增长率 | ≥20% | ≥15% | ≥20% | 酣客基数低可激进,博海保增长 | +| 扩大收入规模 | 新客户收入占比 | ≥15% | ≥10% | ≥15% | 酣客渠道依赖重,新客占比现实目标 | +| 优化成本结构 | 毛利率提升 | ≥3% | ≥2% | ≥2% | 两实体毛利均低于通用标准(18.6%/13.1%) | +| 优化成本结构 | 管理费用率 | ≤15% | ≤20%(首年) | ≤10% | 酣客447%极度低效需分步收紧,博海1.4%已健康 | +| 保障现金流安全 | 现金比率 | ≥20% | ≥5%(首年) | ≥10% | 酣客0.6%断流风险,先保命再达标 | +| 保障现金流安全 | 经营现金流为正 | 为正 | 为正(Q3) | 为正(Q2) | 现金流安全优先 | +| 客户亲密 | 客户满意度 | ≥90% | ≥85% | ≥90% | 酣客渠道满意度现状偏低 | +| 卓越运营 | 按时交付率 | ≥98% | ≥95% | ≥95% | IT项目交付约束 | + +## 行业包校准表 + +### trading 贸易包(酣客适用) +| 模板 | KR | 模板默认 | 酣客建议 | 理由 | +|:--|:--|:--:|:--:|:--| +| 优化渠补结构 | 渠补率 | ≤75% | ≤80%(首年)→75%(次年) | 现状82.8%,一步到位不现实,逐步收紧 | +| 优化渠补结构 | 渠补成本下降 | ≥20% | ≥10% | 谈判能力建设期,先降10% | +| 加速应收周转 | 应收周转天数 | ≤30天 | ≤45天 | 渠道账期现状更长,45天为跳一跳目标 | + +### it_service 包(博海适用) +| 模板 | KR | 模板默认 | 博海建议 | 理由 | +|:--|:--|:--:|:--:|:--| +| 提升人均产值 | 人均产值 | ≥30万/季 | ≥25万/季 | 当前人效基础,首年25万更现实 | +| 提升人均产值 | 项目毛利率 | ≥25% | ≥20% | IT项目毛利普遍低于25% | +| 交付标准化 | 项目按时交付率 | ≥90% | ≥85% | 先建SOP再提交付率 | + +## 校准执行建议 + +1. **应用模板时**:前端在"从模板创建"弹窗提示"目标值为通用参考,请按企业实际校准"(已含在模板应用流程) +2. **分步收紧**:反向指标(渠补率/费用率)逐年下调5%,不一步到位 +3. **保留记录**:每次校准记录修改人和日期(模板 owner 字段 + updated_at 已支持追溯) +4. **联动 KPI 字典**:校准目标值后,同步更新对应 KPI 的 target_monthly/quarterly/yearly(多粒度派生会自动适配) + +## 校准与缺口的关系 + +- 缺口清单(docs/kpi-dictionary-gap-list.md)中的制造业指标(OEE/产能利用率等)补录后,制造行业包才能完整校准 +- 校准本质是"KR 目标值 → KPI 目标值"的桥接,五步法"成果输出"环节落地 diff --git a/frontend/src/views/OKRTemplates.vue b/frontend/src/views/OKRTemplates.vue index 78678f61..cc7f667a 100644 --- a/frontend/src/views/OKRTemplates.vue +++ b/frontend/src/views/OKRTemplates.vue @@ -57,6 +57,7 @@
{{ t.description }}