fix(cma): 工作台跨实体污染治本 — 全局键拆账套 + 缺列收口 + 预警归属兜底
任务 dama-workbench-entity-isolation-fullstack-20260922(DAMA 诊断 / 项目Bot batch5 §B / 任总 2026-09-22「都批」) B1 现金基线拆账套(零 DDL) - cash_forecast_engine: 键 cash.current_balance → cash.current_balance.<entity_id>; 读只读本账套键、不做旧键回退;set_* 签名 entity_id 必传(漏传 TypeError) - cash.py: POST /balance 挂 get_entity_id;网银流水联动写回带账套 B3(a) alignment_config 拆账套(零 DDL) - alignment.py: GET/POST /config、GET /tree 只读 alignment_config.<entity_id>;未配置=configured:false B3(b) 预警 KPI 归属兜底 - bot_bridge_v2: 去掉 kpi_id or 1 兜底;本账套无 KPI 定义 → 跳过建预警 + OperationLog 留痕 (kpi_alerts.kpi_id NOT NULL ⇒ 方案A 置 NULL 不可行,走方案B 跳过+审计) B2 缺列五表分表处置 - notification_logs: 经 alert_id → kpi_alerts.entity_id join 归属(无父键行不返回) - notification_channels / okr_templates: 集团共享口径写入 docstring(有意不过滤) - system_configs: 由 B1/B3(a) 拆键覆盖;kpi_data_quality_logs 沿用 batch5 的 join 收口 P0 语义收敛 - tenant.py: current_tenant 收敛为项目Bot A2A 状态记录,GET 仅 it/ceo;POST 补 operation_logs 审计 证据:新增/改写用例 22 条;全量 1370 passed(基线 1348)
This commit is contained in:
+19
-6
@@ -116,15 +116,21 @@ def api_get_balance(
|
||||
@router.post("/balance")
|
||||
def api_set_balance(
|
||||
data: dict,
|
||||
entity_id: int = Depends(get_entity_id),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
"""设置当前现金余额(万元),作为预测基线"""
|
||||
"""设置当前现金余额(万元),作为预测基线
|
||||
|
||||
账套隔离(B1,2026-09-22):基线落 `cash.current_balance.<entity_id>`,
|
||||
entity 来自会话 token(显式传他账套 entity_id → get_entity_id 403)。
|
||||
修复前本端点无 entity 依赖 → 任一账套设基线会覆盖全平台唯一键。
|
||||
"""
|
||||
from app.utils.cash_forecast_engine import set_current_cash_balance
|
||||
value = float(data.get("current_cash", 0))
|
||||
if value < 0:
|
||||
raise HTTPException(400, "现金余额不能为负")
|
||||
set_current_cash_balance(db, value)
|
||||
return {"message": "当前现金余额已更新", "current_cash": value}
|
||||
set_current_cash_balance(db, value, entity_id)
|
||||
return {"message": "当前现金余额已更新", "entity_id": entity_id, "current_cash": value}
|
||||
|
||||
|
||||
# ══════════════════════════════════════════════════════════
|
||||
@@ -785,7 +791,11 @@ def _is_carry_forward(summary: str, subject_name: str) -> bool:
|
||||
|
||||
|
||||
def _sync_cash_balance_from_ledger(db: Session, entity_id: int, batch: str) -> float:
|
||||
"""货币资金类科目(1001/1002开头)期末余额 → set_current_cash_balance(万元)"""
|
||||
"""货币资金类科目(1001/1002开头)期末余额 → set_current_cash_balance(万元)
|
||||
|
||||
账套隔离(B1,2026-09-22):本函数已按 entity_id 计算余额,写回时**带上该账套**
|
||||
(修复前丢账套 → 任一家导入网银流水就覆盖全平台唯一键的基线)。
|
||||
"""
|
||||
from app.models import VoucherDetail
|
||||
from app.utils.cash_forecast_engine import set_current_cash_balance
|
||||
from app.utils.voucher_guard import apply_voucher_guard
|
||||
@@ -800,8 +810,11 @@ def _sync_cash_balance_from_ledger(db: Session, entity_id: int, batch: str) -> f
|
||||
and (r.subject_code.startswith("1001") or r.subject_code.startswith("1002"))
|
||||
), 2)
|
||||
cash_wan = round(balance_yuan / 10000, 4)
|
||||
set_current_cash_balance(db, cash_wan)
|
||||
logger.info(f"网银流水导入[{batch}] 货币资金期末余额{balance_yuan}元 = {cash_wan}万元 → 现金余额联动")
|
||||
set_current_cash_balance(db, cash_wan, entity_id)
|
||||
logger.info(
|
||||
f"网银流水导入[{batch}] 货币资金期末余额{balance_yuan}元 = {cash_wan}万元 "
|
||||
f"→ 现金余额联动(账套 {entity_id})"
|
||||
)
|
||||
return cash_wan
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user