diff --git a/pipeline_service/workspace.py b/pipeline_service/workspace.py index 8090e92..f82be1e 100644 --- a/pipeline_service/workspace.py +++ b/pipeline_service/workspace.py @@ -275,6 +275,31 @@ async def get_project_dir(sor, uid, session_id=''): return os.path.join(space_dir, 'projects', dname), workspace_base +async def get_project_dir_pl(sor, uid, session_id='', pipeline_id=''): + """产线隔离版:会话项目与指定产线不一致时视为无项目(返回空目录)。 + + 商机/投标产线入口的工作空间不能显示开发产线项目的空间—— + 会话里残留的跨产线项目(如元景项目)不应劫持本产线的工作空间。 + pipeline_id 为空时不做隔离(向后兼容旧调用)。 + """ + if not pipeline_id: + return await get_project_dir(sor, uid, session_id) + pid = await get_session_project_id(sor, uid, session_id) + if pid: + try: + r = await sor.sqlExe( + "SELECT pipeline_id FROM sd_projects WHERE id=${p}$ LIMIT 1", + {"p": pid}) + if r: + proj_pl = getattr(r[0], 'pipeline_id', '') or '' + if proj_pl != pipeline_id: + # 跨产线项目:视为本产线无项目(与 gateway 的隔离一致) + return '', await get_workspace_base(sor) + except Exception: + pass + return await get_project_dir(sor, uid, session_id) + + async def get_project_apps_modules(sor, uid, session_id=''): """读项目目录下 {应用名}_spec.json,返回 (apps, modules)。 @@ -488,6 +513,7 @@ def load_workspace(): g.get_workspace_path = get_workspace_path g.get_space_dir = get_space_dir g.get_project_dir = get_project_dir + g.get_project_dir_pl = get_project_dir_pl g.get_project_apps_modules = get_project_apps_modules g.get_session_project_id = get_session_project_id g.get_session_context = get_session_context