feat(human_task): 待办提供者注册表register_todo_provider——平台待办开放给外部模块注入(工单模块首用)
- _TODO_PROVIDERS注册表: provider签名async fn(user_id, roles, limit)->[todo dict], dict须含source - list_my_human_todos: db context外遍历providers union(逐个try/except,坏provider不拖垮列表) - count_my_human_tasks: 仅全局角标(project_id空)计入providers——工单不属于产线项目 - 架构: 待办是平台级机制,各部分(产线任务/冒泡问题/工单)产生待办,本模块聚合; 外部模块注册钩子注入,不跨模块读表(sage-module-scaffolding 7.3)
This commit is contained in:
parent
b8a2aeadb7
commit
736a2dd579
@ -32,6 +32,20 @@ T_BUG_ACCEPT = "bug_acceptance"
|
|||||||
T_REQ_CONFIRM = "requirement_confirmation"
|
T_REQ_CONFIRM = "requirement_confirmation"
|
||||||
T_DESIGN_CONFIRM = "design_confirmation"
|
T_DESIGN_CONFIRM = "design_confirmation"
|
||||||
|
|
||||||
|
# ══════════════ 待办提供者注册表(2026-09-10 工单模块接入) ══════════════
|
||||||
|
# 平台待办是平台级机制:各部分(产线任务/冒泡问题/工单/…)产生待办,
|
||||||
|
# 本模块聚合。外部模块通过 register_todo_provider 注入,不跨模块读表。
|
||||||
|
# provider 签名: async fn(user_id, roles, limit) -> [todo dict]
|
||||||
|
# todo dict 须含 source(弹窗按它分流详情端点)+ title/description/created_at。
|
||||||
|
_TODO_PROVIDERS = []
|
||||||
|
|
||||||
|
|
||||||
|
def register_todo_provider(fn):
|
||||||
|
"""注册待办提供者(幂等:同函数不重复注册)。"""
|
||||||
|
if callable(fn) and fn not in _TODO_PROVIDERS:
|
||||||
|
_TODO_PROVIDERS.append(fn)
|
||||||
|
logger.info("todo provider registered: %s", getattr(fn, '__module__', '?'))
|
||||||
|
|
||||||
|
|
||||||
def _get_db():
|
def _get_db():
|
||||||
db = DBPools()
|
db = DBPools()
|
||||||
@ -401,7 +415,20 @@ async def count_my_human_tasks(user_id, project_id=None):
|
|||||||
|
|
||||||
n_q = getattr(q[0], 'c', 0) if q else 0
|
n_q = getattr(q[0], 'c', 0) if q else 0
|
||||||
n_ht = getattr(ht[0], 'c', 0) if ht else 0
|
n_ht = getattr(ht[0], 'c', 0) if ht else 0
|
||||||
return int(n_q) + int(n_ht)
|
_roles_cache = roles
|
||||||
|
total = int(n_q) + int(n_ht)
|
||||||
|
|
||||||
|
# 外部待办提供者(工单等,2026-09-10):仅全局角标(project_id 空)计入——
|
||||||
|
# 工单不属于任何产线项目,项目内角标不混入。坏 provider 不拖垮计数。
|
||||||
|
if not project_id:
|
||||||
|
for fn in list(_TODO_PROVIDERS):
|
||||||
|
try:
|
||||||
|
extra = await fn(user_id, _roles_cache, 100)
|
||||||
|
total += len(extra or [])
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning("todo provider count %s failed: %s",
|
||||||
|
getattr(fn, '__module__', '?'), str(e)[:160])
|
||||||
|
return total
|
||||||
|
|
||||||
|
|
||||||
async def list_my_human_todos(user_id, limit=100):
|
async def list_my_human_todos(user_id, limit=100):
|
||||||
@ -442,8 +469,21 @@ async def list_my_human_todos(user_id, limit=100):
|
|||||||
d = _rec_to_dict(r)
|
d = _rec_to_dict(r)
|
||||||
d['source'] = 'question'
|
d['source'] = 'question'
|
||||||
todos.append(d)
|
todos.append(d)
|
||||||
todos.sort(key=lambda x: str(x.get('created_at') or ''), reverse=True)
|
_roles_cache = roles
|
||||||
return todos[:limit]
|
|
||||||
|
# 外部待办提供者(工单等,2026-09-10):在 db context 外调用,provider 自开连接。
|
||||||
|
# 逐个 try/except——坏 provider 不拖垮整个待办列表(平台级机制必须健壮)。
|
||||||
|
for fn in list(_TODO_PROVIDERS):
|
||||||
|
try:
|
||||||
|
extra = await fn(user_id, _roles_cache, limit)
|
||||||
|
for d in (extra or []):
|
||||||
|
todos.append(d)
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning("todo provider %s failed: %s",
|
||||||
|
getattr(fn, '__module__', '?'), str(e)[:160])
|
||||||
|
|
||||||
|
todos.sort(key=lambda x: str(x.get('created_at') or ''), reverse=True)
|
||||||
|
return todos[:limit]
|
||||||
|
|
||||||
|
|
||||||
async def bug_accept(bug_id, accept, user_id, comment=None):
|
async def bug_accept(bug_id, accept, user_id, comment=None):
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user