feat: 消除同访草案机制,改为查询时通过 companions 数组覆盖

- 删除 POST /visits 中的草案创建逻辑(不再创建空拜访记录)
- 周报查询:manager 角色也显示同访的拜访记录
- 亮灯表覆盖:同访人也算客户拜访覆盖(UNION companions)
- 填报进度:同访人也算今日已填报
- 清理已有 2 条空草案记录

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-07-12 19:40:49 +08:00
parent 3ce77ed606
commit 10835ef15c
3 changed files with 36 additions and 34 deletions
+13 -5
View File
@@ -121,10 +121,14 @@ async def get_reporting_progress(db: AsyncSession, reference_date: date | None =
} if leave else None,
})
# Check today's reporting — visits OR daily notes
today_visits = await db.execute(
select(Visit.manager_id).where(Visit.visit_date == today)
# Check today's reporting — visits (direct + companions) OR daily notes
from sqlalchemy import union_all
today_direct = select(Visit.manager_id).where(Visit.visit_date == today)
today_companion = select(func.unnest(Visit.companions).label("manager_id")).where(
Visit.visit_date == today, Visit.companions.isnot(None)
)
today_combined = union_all(today_direct, today_companion).subquery()
today_visits = await db.execute(select(today_combined.c.manager_id))
today_notes = await db.execute(
select(DailyNote.manager_id).where(DailyNote.note_date == today)
)
@@ -162,9 +166,13 @@ async def get_weekly_report(
# ── Visits ──
visit_query = select(Visit).where(Visit.visit_date >= monday, Visit.visit_date <= sunday)
if role == "manager":
visit_query = visit_query.where(Visit.manager_id == user_id)
visit_query = visit_query.where(
(Visit.manager_id == user_id) | (Visit.companions.any(user_id))
)
elif filter_manager_id:
visit_query = visit_query.where(Visit.manager_id == filter_manager_id)
visit_query = visit_query.where(
(Visit.manager_id == filter_manager_id) | (Visit.companions.any(filter_manager_id))
)
if filter_customer_id:
visit_query = visit_query.where(Visit.customer_id == filter_customer_id)
visit_query = visit_query.order_by(Visit.visit_date.desc())