61c572a19a
- 任务统一合并到 /hall:新增 grab/grab-by-code/bid/doing/complete/deliver/recommend 操作端点(走 TaskService 真实逻辑) - 删除 rbac_opc 全部旧任务端点(广场/详情/grab/bid/doing/complete/assign/recommend/select/deliver),/opc/tasks 返回 404 - /opc/my-tasks 改真实聚合(task_claims 承接 + bids 投标,附任务信息),不再读 opc_tasks 演示表 - dashboard_service.opc_dashboard 改 task_claims 统计 - 删除 opc_tasks 演示表(models/seed/repositories) - BidRepository 新增 list_by_opc - 短信生态(上一轮):sms.py 阿里云签名、seed 7 项配置、send-code scene、rbac_hall 预约/订单短信
53 lines
2.3 KiB
Python
53 lines
2.3 KiB
Python
# -*- 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),
|
|
}
|