开发机迁移

This commit is contained in:
Neo
2026-04-10 06:24:13 +08:00
parent f65c1d038b
commit 79d3c2e97e
50 changed files with 1565 additions and 318 deletions

View File

@@ -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_summaryget_finance_overview
仅 area≠all 时走 dws_finance_area_dailyget_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",