fix(comms): raise_problem同任务同类型pending问题去重——重复冒泡更新既有行(正文/context刷新+任务照挂起)返回原qid,不再每轮新建(实测同task_id qc_reject/review_reject/fault_report堆2-3条pending,角标虚高重复轰炸owner.superuser,2026-09-15用户指令:避免重复)

This commit is contained in:
ymq 2026-09-15 16:52:43 +08:00
parent b4bfa9ec54
commit 6dac18e1b1

View File

@ -82,6 +82,37 @@ async def raise_problem(problem_type, question, from_role, from_agentid="",
return ""
hr = first_handler_role or "agent.main_agent"
ha = first_handler_agentid or ""
# 重复冒泡去重2026-09-15 用户指令「避免重复」):同任务+同问题类型已有
# pending 问题 → 不新建,把正文/context 更新到既有行并返回既有 qid。
# 实测历史数据:同 task_id 的 qc_reject/review_reject/fault_report 各堆 2~3 条
# pending每轮退回都新发一条旧的不答结角标虚高、用户重复看到同一事项。
_tk = (task_id or '').strip()
if _tk and problem_type:
_dup = await sor.sqlExe(
"SELECT id FROM pipeline_agent_questions WHERE task_id=${tk}$ "
"AND problem_type=${pt}$ AND status='pending' "
"ORDER BY created_at DESC LIMIT 1",
{"tk": _tk, "pt": problem_type})
await sor.sqlExe("COMMIT", {})
if _dup:
old_qid = getattr(_dup[0], 'id', '')
_ctx2 = dict(context or {})
if form_schema:
_ctx2['form_schema'] = form_schema
await sor.sqlExe(
"UPDATE pipeline_agent_questions SET question=${q}$, context=${c}$, "
"updated_at=NOW() WHERE id=${i}$",
{"q": question or '', "c": json.dumps(_ctx2, ensure_ascii=False, default=str)
if _ctx2 else None, "i": old_qid})
await sor.sqlExe("COMMIT", {})
if suspend_task:
await sor.sqlExe(
"UPDATE pipeline_tasks SET state='waiting', claimed_by=NULL WHERE id=${tid}$",
{"tid": _tk})
await sor.sqlExe("COMMIT", {})
logger.info("raise_problem dedup: task=%s type=%s reuse qid=%s",
_tk, problem_type, old_qid)
return old_qid
qid = getID()
# form_schema 并入 context 存储(待办详情按它渲染动态表单)
if form_schema: