开发机迁移
This commit is contained in:
@@ -375,9 +375,9 @@ async def get_coach_board(
|
||||
"task_total": task_recall + task_callback,
|
||||
})
|
||||
|
||||
# 7. 排序
|
||||
# 7. 排序(id 作 tiebreaker 保证分页稳定)
|
||||
sort_key, sort_desc = _SORT_KEY_MAP.get(sort, ("perf_hours", True))
|
||||
items.sort(key=lambda x: x.get(sort_key, 0), reverse=sort_desc)
|
||||
items.sort(key=lambda x: (x.get(sort_key, 0), x.get("id", 0)), reverse=sort_desc)
|
||||
|
||||
# 移除内部排序字段
|
||||
for item in items:
|
||||
@@ -406,7 +406,9 @@ def _query_coach_tasks(
|
||||
"""
|
||||
查询助教任务完成数(BOARD-1 task 维度)。
|
||||
|
||||
来源: biz.coach_tasks,按 task_type 分类统计 recall/callback。
|
||||
CHANGE 2026-04-08 | Fix-13 改造:
|
||||
- recall: 广义召回数(从 biz.recall_events 统计,按天去重,不重复叠加)
|
||||
- callback: 回访完成数(从 biz.coach_tasks 统计,status='completed')
|
||||
"""
|
||||
if not assistant_ids:
|
||||
return {}
|
||||
@@ -414,26 +416,42 @@ def _query_coach_tasks(
|
||||
result: dict[int, dict] = {}
|
||||
try:
|
||||
with conn.cursor() as cur:
|
||||
# 广义召回数:从 recall_events 统计(天然去重)
|
||||
cur.execute(
|
||||
"""
|
||||
SELECT assistant_id,
|
||||
COUNT(*) FILTER (WHERE task_type IN ('high_priority_recall', 'priority_recall')) AS recall_count,
|
||||
COUNT(*) FILTER (WHERE task_type = 'relationship_building') AS callback_count
|
||||
FROM biz.coach_tasks
|
||||
SELECT assistant_id, COUNT(*) AS recall_count
|
||||
FROM biz.recall_events
|
||||
WHERE assistant_id = ANY(%s)
|
||||
AND site_id = %s
|
||||
AND completed_at >= %s::date
|
||||
AND completed_at <= %s::date
|
||||
AND status = 'completed'
|
||||
AND pay_time >= %s::date
|
||||
AND pay_time < (%s::date + INTERVAL '1 day')
|
||||
GROUP BY assistant_id
|
||||
""",
|
||||
(assistant_ids, site_id, start_date, end_date),
|
||||
)
|
||||
for row in cur.fetchall():
|
||||
result[row[0]] = {
|
||||
"recall": row[1] or 0,
|
||||
"callback": row[2] or 0,
|
||||
}
|
||||
result.setdefault(row[0], {"recall": 0, "callback": 0})
|
||||
result[row[0]]["recall"] = row[1] or 0
|
||||
|
||||
# 回访完成数:从 coach_tasks 统计
|
||||
cur.execute(
|
||||
"""
|
||||
SELECT assistant_id, COUNT(*) AS callback_count
|
||||
FROM biz.coach_tasks
|
||||
WHERE assistant_id = ANY(%s)
|
||||
AND site_id = %s
|
||||
AND completed_at >= %s::date
|
||||
AND completed_at < (%s::date + INTERVAL '1 day')::timestamptz
|
||||
AND status = 'completed'
|
||||
AND task_type = 'follow_up_visit'
|
||||
GROUP BY assistant_id
|
||||
""",
|
||||
(assistant_ids, site_id, start_date, end_date),
|
||||
)
|
||||
for row in cur.fetchall():
|
||||
result.setdefault(row[0], {"recall": 0, "callback": 0})
|
||||
result[row[0]]["callback"] = row[1] or 0
|
||||
|
||||
conn.commit()
|
||||
except Exception:
|
||||
logger.warning("BOARD-1 任务查询失败,降级为空", exc_info=True)
|
||||
@@ -762,11 +780,16 @@ def _build_overview(
|
||||
) -> dict:
|
||||
"""经营一览板块。
|
||||
|
||||
CHANGE 2026-04-01 | board-finance-dws-area-refactor 9.1 |
|
||||
改为从 dws_finance_area_daily 按 area_code 查询(通过 get_finance_overview_area)。
|
||||
CHANGE 2026-04-08 | P0 修复发生额失真 |
|
||||
area=all 时回退到 dws_finance_daily_summary(get_finance_overview),
|
||||
仅 area≠all 时走 dws_finance_area_daily(get_finance_overview_area)。
|
||||
原因:area_daily 的 all 行只聚合有桌台映射的结算单,漏算无桌台单据约 12%。
|
||||
"""
|
||||
try:
|
||||
data = fdw_queries.get_finance_overview_area(conn, site_id, start, end, area)
|
||||
if area == "all":
|
||||
data = fdw_queries.get_finance_overview(conn, site_id, start, end)
|
||||
else:
|
||||
data = fdw_queries.get_finance_overview_area(conn, site_id, start, end, area)
|
||||
except Exception:
|
||||
logger.warning("overview 查询失败,降级为空", exc_info=True)
|
||||
return _empty_overview()
|
||||
@@ -775,7 +798,10 @@ def _build_overview(
|
||||
|
||||
if compare == 1 and prev_start and prev_end:
|
||||
try:
|
||||
prev = fdw_queries.get_finance_overview_area(conn, site_id, prev_start, prev_end, area)
|
||||
if area == "all":
|
||||
prev = fdw_queries.get_finance_overview(conn, site_id, prev_start, prev_end)
|
||||
else:
|
||||
prev = fdw_queries.get_finance_overview_area(conn, site_id, prev_start, prev_end, area)
|
||||
_attach_compare(result, data, prev, [
|
||||
"occurrence", "discount", "discount_rate", "confirmed_revenue",
|
||||
"cash_in", "cash_out", "cash_balance", "balance_rate",
|
||||
|
||||
Reference in New Issue
Block a user