"""Push orchestration helpers. Separates eligibility / cooldown decisions from payload rendering and transport. """ from app.db.recommendation_queries import log_push, should_push from app.integrations.feishu_push import build_trade_action_card, push_card def push_mainline_state_update(symbol: str, rec_id: int, mainline_item: dict, title_prefix: str | None = None, entry_push_type: str = "entry", watch_push_type: str = "watch_pool") -> bool: """主链路状态只记录,不再飞书推送。""" status = mainline_item.get("execution_status") if mainline_item else "missing" action = mainline_item.get("action_status", "") if mainline_item else "" print(f"[push] skip {symbol}: mainline notifications disabled (status={status}, action={action})") return False def push_trade_action_update(symbol: str, rec_id: int, state_decision: dict, final_action: str, push_type: str = "entry") -> bool: if not state_decision.get("push_required"): return False if not should_push(symbol, push_type, final_action): print(f"⏭ 跳过推送({symbol}): {push_type}/{final_action} 12h冷却中") return False card = build_trade_action_card( state_decision["push_symbol"], state_decision["push_current_price"], state_decision["push_entry_price"], state_decision["push_pnl_pct"], final_action, state_decision.get("push_signals", []), state_decision.get("stop_loss", 0), state_decision.get("tp1", 0), state_decision.get("tp2", 0), ) if isinstance(card, tuple): ok, resp = card else: ok, resp = push_card(card) if ok: log_push(symbol, push_type, final_action, rec_id=rec_id) return True print(f"飞书推送失败({symbol}): {resp}") return False