36ba9338f1
wecom.py: - Token 自动续期 (7200s 过期 + 60s 提前量 + 42001 重试) - POST 请求自动重试 (最多 3 次,含速率限制退避) - 新增 send_markdown_message() / send_template_card() 富消息方法 wecom.py API: - GET /api/wecom/callback: 企微回调 URL 验证 (SHA1 签名 + AES 解密) - POST /api/wecom/callback: 事件接收占位 scheduler.py: - 仅推送给已绑定 wecom_userid 的经理 - 消息内容优化 (已填报/未填报人数统计) main.py: - APScheduler 注册每日 17:30 自动检查填报 已验证: WECOM_TOKEN 获取成功 Co-Authored-By: Claude <noreply@anthropic.com>
66 lines
2.3 KiB
Python
66 lines
2.3 KiB
Python
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),
|
|
}
|