Files
server-core/app/services/dashboard_service.py
T
Pine 61c572a19a feat(task,sms): 任务功能增量合并到大厅 + 短信生态配置
- 任务统一合并到 /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 预约/订单短信
2026-09-01 11:22:19 +08:00

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),
}