"""``permission.lifecycle_sweep`` — approval reminders / escalation + validity expiry (migration 606).""" from __future__ import annotations import logging import uuid from datetime import UTC, datetime from typing import Any from sqlalchemy.ext.asyncio import AsyncSession from app.scheduled_jobs.registry import register_scheduled_job logger = logging.getLogger(__name__) PERMISSION_LIFECYCLE_HANDLER = "permission.lifecycle_sweep" @register_scheduled_job( key=PERMISSION_LIFECYCLE_HANDLER, display_name="软件权限 · 审批催办 / 到期回收", description=( "每日 09:50(Asia/Shanghai)。① pending_approval 的权限申请按 permission.approval." "reminder_days 催审批人,超过 escalate_to_it_after_days 抄送 IT;② expires_at 已过" "的 active 权限发 revoke 任务(与撤销同一条驱动链路),任务成功后状态落成 expired;" "持有人是否收到「已到期」由 notify_holder_on_expiry 控制,默认关。" ), ) async def run_permission_lifecycle_sweep( db: AsyncSession, config: dict[str, Any], ) -> dict[str, Any]: del config from app.domains.permission.lifecycle import ( # noqa: PLC0415 load_approval_settings, sweep_lifecycle, ) trace_id = f"permission_lifecycle_sweep:{uuid.uuid4().hex}" settings = await load_approval_settings(db) summary = await sweep_lifecycle( db, now=datetime.now(UTC), settings=settings, trace_id=trace_id, ) await db.commit() summary["settings"] = settings.to_setting() return summary