feat(api): GET /api/staff-stats 7类计数+分型明细(voice走user_id join,新客户add_time兜底,红包金额提取)

计数模式(无kind)返回 new_customers/new_groups/red_transfer/del_customers/
blocked_customers/voice_calls/sensitive_words(恒0,spec占位);明细模式
(?kind=)返回{kind,rows},每kind字段不同,前端按kind配列。start/end
缺省近7天。

口径(spec §4.5,全本地聚合):
- new_customers: add_time窗内;IS NULL行用该对话首条消息min(timestamp)兜底
- new_groups: chat_group.create_time窗内(复合PK按owner过滤)
- red_transfer: wechat type IN (red_packet,transfer)窗内;金额三路正则
  (红包XML feedesc/转账纯文本/totalamount),实测真库转账399/399全提取
- del/blocked_customers: 现存量口径忽略窗口,明细time=updated_at毫秒
- voice_calls: phone_call.user_id存员工userId(32HEX)非wxId——先经
  wechat_account.user_id换算,账号无uid返回空防跨员工串数
- voice明细字段语义对齐CallList.vue(connected=call_status==1,
  media_url本地/api/media/{hash}优先OSS兜底)

真机smoke(yunke-mysql):voice 61条/新客67/删除29/拉黑1均通过;
转账金额100%提取。真库chat_group列与message.type回填滞后(运维项,另报)。

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
浅念
2026-08-25 16:22:44 +08:00
parent 2baa6d0814
commit b95fc5fa6f
4 changed files with 758 additions and 0 deletions
+3
View File
@@ -20,6 +20,7 @@ Includes:
* ``GET /api/sync/status`` (see :mod:`app.api.routers.sync`).
* ``GET /api/search`` (see :mod:`app.api.routers.search`).
* ``GET /api/export/chat-html`` (see :mod:`app.api.routers.export`).
* ``GET /api/staff-stats`` (see :mod:`app.api.routers.staff_stats`).
CORS is configured to read explicit allowed origins from ``Settings.cors_origins``
(comma-separated ``CORS_ORIGINS`` env var). Empty (default) falls back to the dev
@@ -53,6 +54,7 @@ from app.api.routers import (
sessions,
sms,
staff_chat_stats,
staff_stats,
sync,
voice_clips,
)
@@ -88,6 +90,7 @@ app.include_router(groups.router)
app.include_router(calls.router)
app.include_router(sms.router)
app.include_router(staff_chat_stats.router)
app.include_router(staff_stats.router)
app.include_router(sync.router)
app.include_router(search.router)
app.include_router(sessions.router)