fix(cma): KR 名称污染存量清理 + 透传点护栏 (cma-kr-name-pollution-cleanup-20260916)
ci/woodpecker/push/main Pipeline was canceled

- kr_name.py/krName.ts: sanitize_kr_name 判据(尾部≥/≤数字≠目标值→截断;==目标值→保留)
- maps.py/okr.py/okr_templates.py: 模板名/JSON→krs.title 透传点护栏
- test: 28 passed(独立复核)
- 原会话因迭代上限停手,本提交代收口(工作已复核完成)
This commit is contained in:
Hermes CI Fix
2026-09-16 14:48:06 +08:00
parent 09fb11d86f
commit 06c23927aa
8 changed files with 300 additions and 3 deletions
+12
View File
@@ -11,6 +11,10 @@ from app.database import get_db
from app.deps import get_entity_id
from app.auth_middleware import require_role
from app.models import Objective, ActionPlan, KR, ObjectiveKPI, KPIDefinition
from app.utils.kr_name import sanitize_kr_name
import logging
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/cma/okr", tags=["OKR目标管理"],
dependencies=[Depends(require_role("ceo", "finance", "it"))],
@@ -329,6 +333,14 @@ def sync_krs(objective_id: int, data: dict, db: Session = Depends(get_db),
kpi_id = kpi.id if kpi else None
operator, target_value = _inherit_kpi_direction(db, kpi_id, item.get("operator"), item.get("target_value"))
# 护栏(2026-09-16):画布节点/接口传来的 KR 名若带历史污染尾巴(尾部「≥/≤+被截断的数字」)
# 在此规整,防污染经 krs.title 继续传染(判据见 app/utils/kr_name.py)
_tv = item.get("target_value")
title, _polluted = sanitize_kr_name(title, _tv if _tv is not None else target_value)
if _polluted:
logger.warning("KR名称污染已规整: objective=%s %r -> %r (target=%s)",
objective_id, item.get("title") or item.get("name"), title, _tv)
kr = None
if item.get("id") and int(item["id"]) in existing:
kr = existing[int(item["id"])]