import uuid from typing import Optional from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from app.database import get_db from app.middleware.auth import get_current_user, require_director from app.models.user import User from app.services.wecom import wecom_client from app.services.scheduler import check_daily_reporting router = APIRouter(prefix="/wecom", tags=["WeChatWork"]) class RemindRequest(BaseModel): user_ids: list[str] message: Optional[str] = None class AnnouncementRequest(BaseModel): content: str @router.post("/remind") async def send_reminder( data: RemindRequest, current_user: dict = Depends(require_director), db: AsyncSession = Depends(get_db), ): """Director manually sends reminder to specific managers.""" # Get wecom_userids for the selected users result = await db.execute( select(User.wecom_userid).where(User.id.in_([uuid.UUID(uid) for uid in data.user_ids])) ) wecom_ids = [r[0] for r in result.all() if r[0]] content = data.message or "📋 请及时完成今日拜访记录填报。" success = await wecom_client.send_text_message(wecom_ids, content) return {"success": success, "sent_to": len(wecom_ids)} @router.post("/announcement") async def send_announcement( data: AnnouncementRequest, current_user: dict = Depends(require_director), db: AsyncSession = Depends(get_db), ): """Director sends an announcement to all team members.""" # Get all wecom_userids in the department result = await db.execute(select(User.wecom_userid).where(User.wecom_userid.isnot(None))) wecom_ids = [r[0] for r in result.all()] content = f"📢 支局长公告\n\n{data.content}" success = await wecom_client.send_text_message(wecom_ids, content) return {"success": success, "sent_to": len(wecom_ids)} @router.post("/trigger-daily-check") async def trigger_daily_check( current_user: dict = Depends(require_director), db: AsyncSession = Depends(get_db), ): """Manually trigger the daily reporting check (for testing or manual use).""" result = await check_daily_reporting(db) return result