"""流失风险预警。""" from datetime import datetime, timezone from sqlalchemy import select, func from sqlalchemy.ext.asyncio import AsyncSession from app.models.company import Company from app.models.report import MonthlyReport async def detect_churn_risk(db: AsyncSession, tenant_id: str) -> list[dict]: """识别企业活跃度下降/数据共享减少/互动减少的早期信号。""" result = await db.execute( select(Company).where(Company.tenant_id == tenant_id) ) companies = result.scalars().all() risks: list[dict] = [] for company in companies: # 检查最近月报提交情况 report_result = await db.execute( select(func.count(MonthlyReport.id)) .where(MonthlyReport.company_id == company.id) ) report_count = report_result.scalar_one() if report_count == 0: risks.append({ "company_id": str(company.id), "company_name": company.name, "risk_level": "high", "signals": ["从未提交月报"], "detected_at": datetime.now(timezone.utc).isoformat(), }) return risks