Files
wecom-fullstackandHermes CI Fix d85dd2a155
ci/woodpecker/push/main Pipeline was successful
feat(strategy-map): A3 三维切片(时间/门店/产品)——切片重算 + 显式空态 + entity 隔离
- 新增 /api/cma/maps/{id}/dimension-options 与 /{id}/slice(只读)
- 时间:kpi_values.period 月/季/年;flow 求和、ratio 均值、balance/status 取最新
- 产品:product_sales + 逐月源一致性闸门(偏差>1% 不切片)
- 门店:库内无门店级事实 ⇒ available=false + reason,绝不回退总额
- 前端 MapDimensionFilter 挂到 MapCanvas,切换即 emit 切片,清除恢复 /review
2026-10-19 13:32:49 +08:00

26 lines
1.6 KiB
Python

# -*- coding: utf-8 -*-
"""A3 产品切片正例:2026-07(源一致性通过)逐产品核对。"""
import os, sys
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
for line in open('/root/cma-management/backend/.env'):
line = line.strip()
if '=' in line and not line.startswith('#') and line.split('=')[0].startswith('CMA_DB'):
k, v = line.split('=', 1); os.environ.setdefault(k, v)
from app.database import get_session_local
from app.api.map_dimensions import build_slice
db = get_session_local()()
for prod in ("酣客酱酒", "禧酱", "标准版"):
r = build_slice(db, 1, 65, "2026-07", None, prod)
rev = [k for o in r["objectives"] for k in o["kpis"] if k["kpi_code"] == "F_REVENUE"][0]
print(prod, "| empty:", r["empty"], "|", r["empty_reason"], "| rev:", rev["actual_value"], "/", rev["target_value"], rev["achievement_pct"], rev["aggregation"], rev["periods_used"], "| note:", rev["reason"])
r = build_slice(db, 1, 65, "2026-Q3", None, "酣客酱酒")
rev = [k for o in r["objectives"] for k in o["kpis"] if k["kpi_code"] == "F_REVENUE"][0]
print("Q3 酣客酱酒 | empty:", r["empty"], "| rev:", rev["actual_value"], "/", rev["target_value"], rev["achievement_pct"], rev["aggregation"], rev["periods_used"], "| note:", rev["reason"])
r = build_slice(db, 1, 65, None, None, None)
print("默认(最新期):", r["slice"], [ (k["kpi_code"],k["actual_value"]) for o in r["objectives"] for k in o["kpis"] if k["available"]][:6])
print("store 空态:", build_slice(db, 1, 65, "2026-07", "一店", None)["empty_reason"])
db.close()