diff --git a/pipeline_bidding/bid_flow.py b/pipeline_bidding/bid_flow.py index 2a49ba7..3cf7477 100644 --- a/pipeline_bidding/bid_flow.py +++ b/pipeline_bidding/bid_flow.py @@ -1386,7 +1386,9 @@ async def reconcile_project(sor, project_id, project_name=""): await sor.sqlExe("COMMIT", {}) return acts + ["trimmed: delivery_confirm 已裁剪,标书直接置 delivered,项目完成"] ht = await find_human_task(sor, project_id, HT_DELIVERY_CONFIRM) - if not ht: + # cancelled/rejected 的旧待办视为不存在(2026-09-16:章节退回重写时联动作废 + # 过旧待办,重合成后必须重发新版确认待办,否则卡 waiting 死锁) + if not ht or ht.get("status") in ("cancelled", "rejected"): hid = await create_human_task( sor, project_id, HT_DELIVERY_CONFIRM, "标书评分通过,请确认交付", "标书已通过评分门限,请人工复核用印/密封/份数/递交后确认交付。") diff --git a/pipeline_bidding/bid_review_capability.py b/pipeline_bidding/bid_review_capability.py index a0cf47e..07e4cfe 100644 --- a/pipeline_bidding/bid_review_capability.py +++ b/pipeline_bidding/bid_review_capability.py @@ -163,6 +163,26 @@ async def review_chapter(chapter_id, score, max_score="", comments="", detail="" who=who, agent_id=agent_id, detail="%.2f/%.2f revise=%d" % (sc, ms, revise)) + # ── 标书状态联动作废(2026-09-16 甘肃项目实测 bug)── + # 章节退回重写时,若 bid_documents 已合成且停在 draft/reviewing/passed, + # 对账器 E 段只对「无文档 or 文档 rejected」派合成任务 → 重写后的新正文 + # 永远进不了交付物(甘肃 bid_v1 即此状:章节被退回、文档仍 passed、 + # 待办仍指向旧版)。退回即把当前标书置 rejected,全章 approved 后 + # 自动重派合成(prev_version 递增出新版),形成完整闭环。 + try: + await sor.sqlExe( + "UPDATE bid_documents SET status='rejected', updated_at=NOW() " + "WHERE project_id=${pid}$ AND status IN ('draft','reviewing','passed')", + {"pid": pid}) + # 交付确认待办同步取消(指向旧版标书,留着=僵尸待办误导用户确认旧版) + await sor.sqlExe( + "UPDATE pipeline_human_tasks SET status='cancelled', updated_at=NOW() " + "WHERE project_id=${pid}$ AND task_type=${tt}$ AND status='pending'", + {"pid": pid, "tt": "bid_delivery_confirm"}) + await sor.sqlExe("COMMIT", {}) + except Exception as e: # noqa: BLE001 + logger.warning("章节退回联动标书作废失败 pid=%s: %s", pid, e) + if revise > th["max_revise"]: # 2026-09-16 标题级去重:多章各自达上限各发一条(旧代码类型级 dedup, # 第 2~N 章升级信号被第一条 general pending 吞掉——甘肃项目 1/2.1.5/2.2