alphax/app/integrations/push_orchestrator.py
2026-05-18 08:35:28 +08:00

44 lines
1.8 KiB
Python

"""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