fix: get_session_project_id产线不匹配不再删除项目指针

根因: _valid只返回空串,调用方无法区分'项目已删'(应清理自愈)和
'跨产线合法上下文'(必须保留)。原实现产线不匹配也删全局/会话指针——
平台页点一次「工作空间」就把用户在投标页的当前项目清掉(复现脚本实锤)。
修复: _valid返回(vpid, reason), gone才清理, cross只视为无项目回退
This commit is contained in:
ymq 2026-09-02 19:01:18 +08:00
parent 19c7d05105
commit 9d40816fac

View File

@ -152,13 +152,13 @@ async def get_session_project_id(sor, uid, session_id='', pipeline_id=''):
return ''
async def _valid(pid):
"""pid 存在(且产线匹配,若指定)则返回 pid否则 ''"""
"""返回 (vpid, reason)vpid 有效则返回;否则 '' + 原因('gone'=项目已删, 'cross'=跨产线)"""
pl = await _project_pipeline(pid)
if pl is None:
return ''
return '', 'gone'
if pipeline_id and pl and pl != pipeline_id:
return ''
return pid
return '', 'cross'
return pid, ''
if session_id:
try:
@ -169,18 +169,21 @@ async def get_session_project_id(sor, uid, session_id='', pipeline_id=''):
if recs:
pid = getattr(recs[0], 'current_project_id', '') or ''
if pid:
vpid = await _valid(pid)
vpid, reason = await _valid(pid)
if vpid:
return vpid
# 悬空引用:清掉死记录,回退全局
try:
await sor.sqlExe(
"DELETE FROM pipeline_session_settings "
"WHERE user_id=${u}$ AND session_id=${s}$",
{"u": uid, "s": session_id})
await sor.sqlExe("COMMIT", {})
except Exception:
pass
if reason == 'gone':
# 悬空引用:项目已删除 → 清掉死记录(自愈),回退全局
try:
await sor.sqlExe(
"DELETE FROM pipeline_session_settings "
"WHERE user_id=${u}$ AND session_id=${s}$",
{"u": uid, "s": session_id})
await sor.sqlExe("COMMIT", {})
except Exception:
pass
# reason == 'cross':跨产线的合法上下文,不删除(删除会让用户
# 在该产线页面丢失当前项目),只视为本会话无项目继续回退
except Exception:
pass
try:
@ -189,16 +192,21 @@ async def get_session_project_id(sor, uid, session_id='', pipeline_id=''):
{"u": uid})
pid = getattr(recs[0], 'current_project_id', '') if recs else ''
if pid:
vpid = await _valid(pid)
vpid, reason = await _valid(pid)
if vpid:
return vpid
try:
await sor.sqlExe(
"UPDATE pipeline_agent_settings SET current_project_id='' "
"WHERE user_id=${u}$", {"u": uid})
await sor.sqlExe("COMMIT", {})
except Exception:
pass
if reason == 'gone':
# 悬空引用:项目已删除 → 清全局指针(自愈)
try:
await sor.sqlExe(
"UPDATE pipeline_agent_settings SET current_project_id='' "
"WHERE user_id=${u}$", {"u": uid})
await sor.sqlExe("COMMIT", {})
except Exception:
pass
# reason == 'cross':全局项目属于另一产线的合法上下文,不删除
# 2026-09-02 修复:原实现产线不匹配也删全局指针,平台页点一次
# 「工作空间」就把用户在投标页的当前项目清掉)
return ''
except Exception:
return ''