from datetime import date, datetime from sqlalchemy import select, func from sqlalchemy.ext.asyncio import AsyncSession from app.models.visit import Visit from app.models.daily_note import DailyNote from app.models.user import User from app.services.wecom import wecom_client from app.utils.timezone import today_cst async def check_daily_reporting(db: AsyncSession) -> dict: """Check today's reporting progress and send wecom reminders to managers who haven't reported.""" today = today_cst() weekday = today.weekday() if weekday >= 5: # Skip weekends return {"status": "weekend", "date": str(today)} # Get all managers with wecom_userid result = await db.execute( select(User).where(User.role == "manager", User.wecom_userid.isnot(None)) ) managers = result.scalars().all() # Get managers who have reported today reported_visits = await db.execute( select(Visit.manager_id).where(Visit.visit_date == today) ) reported_notes = await db.execute( select(DailyNote.manager_id).where(DailyNote.note_date == today) ) reported_map = {str(uid): True for uid, in reported_visits.all()} for uid, in reported_notes.all(): reported_map[str(uid)] = True not_reported = [] reported_names = [] for m in managers: if str(m.id) in reported_map: reported_names.append(m.name) else: not_reported.append(m) # Send markdown message to not-reported managers if not_reported: names = "、".join(m.name for m in not_reported) content = ( f"## 📋 今日填报提醒\n\n" f"> 日期:{today}\n" f"> 已填报:{len(reported_names)} 人\n" f"> 未填报:**{len(not_reported)} 人**\n\n" f"以下同事尚未提交今日拜访记录:\n" + "".join(f"- **{m.name}**\n" for m in not_reported) + f"\n请尽快完成今日拜访填报 🙏" ) user_ids = [m.wecom_userid for m in not_reported if m.wecom_userid] if user_ids: await wecom_client.send_text_message(user_ids, content) return { "status": "ok", "date": str(today), "total_managers": len(managers), "reported": len(reported_map), "not_reported": len(not_reported), }