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 result = await db.execute(select(User).where(User.role == "manager")) 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 = [] for m in managers: if str(m.id) not in reported_map: not_reported.append(m) if not_reported and managers: content = f"📋 今日填报提醒({today})\n\n以下同事尚未提交今日拜访记录:\n" for m in not_reported: content += f"• {m.name}\n" content += "\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), }