diff --git a/yunke-server/app/sync/cli.py b/yunke-server/app/sync/cli.py index 11372c6..ba5086a 100644 --- a/yunke-server/app/sync/cli.py +++ b/yunke-server/app/sync/cli.py @@ -423,21 +423,35 @@ async def _cmd_employee_metrics(args: argparse.Namespace) -> int: try: import sqlalchemy as sa - from app.db.models import MsgDailyStats + from app.db.models import MsgDailyStats, PhoneCall from app.storage.employee_metrics import ( recompute_call_days, recompute_metric_days, ) + from app.storage.summary import day_key async with session_maker() as session: - days = ( + msg_days = ( await session.execute(sa.select(MsgDailyStats.day).distinct()) ).scalars().all() - rows = await recompute_metric_days(session, list(days)) - calls = await recompute_call_days(session, list(days)) + # 宽表全走消息派生源,只算消息日。 + rows = await recompute_metric_days(session, list(msg_days)) + # 通话日 = 消息日 ∪ 通话日:消息空窗日(节假日/同步缺口)的通话 + # 也要进小表。start_call_time→上海日必须在 Python 侧走 day_key + # ——MySQL 会话时区是 UTC,SQL 日期函数会切错日。 + call_ts = ( + await session.execute( + sa.select(PhoneCall.start_call_time) + .where(PhoneCall.start_call_time.is_not(None)) + .distinct() + ) + ).scalars().all() + call_days = sorted(set(msg_days) | {day_key(ts) for ts in call_ts}) + calls = await recompute_call_days(session, call_days) await session.commit() print( - f"[employee-metrics] rebuilt {rows} wide rows, {calls} call rows" + f"[employee-metrics] rebuilt {rows} wide rows, {calls} call rows " + f"({len(call_days)} days)" ) return 0 finally: