"""个人绩效统计(PRD §4.7)。 口径说明(E1 最小口径):个人 AUM=名下客户持有中市值之和;报告发送数=advisor_report sent 计数;回访次数=advisor_visit_record 计数。服务完成率/回访达标率等 P2 后置。 """ from __future__ import annotations from sqlalchemy.ext.asyncio import AsyncSession from common_const import CUSTOMER_REL_STATUS_SIGNED, REPORT_SEND_STATUS_SENT from model.sys_user import SysUser from repositories.advisor_report import AdvisorReportRepo from repositories.advisor_visit_record import AdvisorVisitRecordRepo from repositories.customer_relation import CustomerRelationRepo async def personal_report(db: AsyncSession, user: SysUser) -> dict: relation_repo = CustomerRelationRepo(db) report_repo = AdvisorReportRepo(db) visit_repo = AdvisorVisitRecordRepo(db) total = await relation_repo.count_customer_rows(advisor_id=user.id) signed = await relation_repo.count_customer_rows( advisor_id=user.id, status=CUSTOMER_REL_STATUS_SIGNED ) aum = await relation_repo.sum_holdings_value(user.id) sent = await report_repo.count_by_advisor( advisor_id=user.id, send_status=REPORT_SEND_STATUS_SENT ) visits = await visit_repo.count_by_advisor(advisor_id=user.id) return { "total_aum": f"{aum:.2f}", "total_customers": total, "signed_customers": signed, "reports_sent": sent, "visits_count": visits, }