diff --git a/pipeline_bidding/bid_compose_capability.py b/pipeline_bidding/bid_compose_capability.py index 34b6e2a..b6ab3d6 100644 --- a/pipeline_bidding/bid_compose_capability.py +++ b/pipeline_bidding/bid_compose_capability.py @@ -23,18 +23,16 @@ async def _workspace_dir(sor, project_id): 不走 get_workspace_dir(那个依赖会话当前项目),角色 agent 场景下按项目自身字段解析。 旧实现自行拼 {base}/{org}/{pipeline_id}/{项目名}(旧平铺口径)导致与项目目录错位, 2026-09-01 收敛到引擎统一函数根治。 + + 铁律(输出文件必须在项目空间内):解析失败绝不回退 /tmp—— + 标书是交付件,写到项目外就违反"输出文件必须在项目空间内"。宁可合成失败。 """ - try: - from pipeline_service.workspace import get_project_dir_by_id - pdir, _ = await get_project_dir_by_id(sor, project_id) - if pdir: - os.makedirs(pdir, exist_ok=True) - return pdir - except Exception as e: - logger.warning("workspace resolve failed: %s", str(e)[:120]) - d = os.path.join("/tmp", "pipeline_bidding", project_id) - os.makedirs(d, exist_ok=True) - return d + from pipeline_service.workspace import get_project_dir_by_id + pdir, _ = await get_project_dir_by_id(sor, project_id) + if pdir: + os.makedirs(pdir, exist_ok=True) + return pdir + return '' def _write_docx(path, title, subtitle, chapters): @@ -130,6 +128,8 @@ async def compose_bid(project_id, doc_name="", who=None, agent_id=None, task_id= ver = to_int(getattr(vrec[0], "v", 0) if vrec else 0) + 1 ws = await _workspace_dir(sor, project_id) + if not ws: + return False, "无法解析项目工作目录(输出文件必须落项目空间内,已中止合成)" title = doc_name or ("%s 投标文件" % (tender.get("title") or proj.get("name") or "项目")) subtitle = "投标人:(本单位)  招标编号:%s" % (tender.get("tender_no") or "-")