# -*- coding: utf-8 -*- """业务层 · 工作台聚合服务(各端口 dashboard)。""" from __future__ import annotations from ..infrastructure.repositories import Database class DashboardService: """OPC 工作台聚合:统计/进行中任务/智能体建议/月度收入/最新消息。""" def __init__(self, db: Database): self.db = db async def opc_dashboard(self, uid: str) -> dict: profile = await self.db.opc_profiles.get(uid) # 2026-09 增量合并:任务统计改真实 task_claims 接单流水(不再用 opc_tasks 演示看板) claims = await self.db.task_claims.list_by_claimer(uid) in_progress = sum(1 for c in claims if c["status"] in ("claimed", "doing", "assigned")) completed = sum(1 for c in claims if c["status"] == "completed") active_tasks = [] for c in claims: if c["status"] not in ("claimed", "doing", "assigned"): continue t = await self.db.tasks.get(c["task_id"]) if t: active_tasks.append({ "id": t["id"], "title": t.get("title", ""), "status": t.get("status", ""), "deadline": t.get("deadline", ""), "budget": t.get("budget_max") or t.get("budget_min") or 0, }) active_tasks = active_tasks[:3] policy_count = len( [c for c in await self.db.content.list(ctype="policy", status="published")] ) agent_tips = [ {"title": "政策匹配提醒", "desc": f"{policy_count} 项新政策与您高度匹配", "type": "policy"}, {"title": "报税截止提醒", "desc": "本月报税截止 7月31日", "type": "tax"}, {"title": "技能提升推荐", "desc": "推荐参加 UI 设计研修班", "type": "skill"}, ] return { "stats": { "inProgressTasks": in_progress, "completedTasks": completed, "totalEarnings": await self.db.finance.total_income(uid), "creditScore": (profile or {}).get("credit_score", 80), }, "activeTasks": active_tasks, "agentTips": agent_tips, "monthlyIncome": await self.db.finance.monthly_income(uid), "recentMessages": await self.db.messages.recent(uid, limit=4), }